现在的位置: 首页 > 综合 > 正文

SOCKET_C/S_CODE

2013年11月27日 ⁄ 综合 ⁄ 共 3547字 ⁄ 字号 评论关闭

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
/**
struct sockaddr {
        ushort_t        sa_family;      // address family
        char            sa_data[14];    // up to 14 bytes of direct address
};
*/
#include <netinet/in.h>
/**
struct sockaddr_in {
        u_short sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};
*/

#define SERVPORT 4444  /* 服务器监听端口号 */
#define BACKLOG 10  /* 最大同时连接请求数 */

int getAtoi(char *str)
{
 printf("in_str:[%s]/n", str);
 int i=0;
 while(i < strlen(str))
 {
  if(str[i]<48 || str[i]>57)
  {
   return -1;
  }
  i++;
 }
 return atoi(str);
}

int main(int argc, char* argv[])
{
 int listen_sockFD;  /* 服务器监听socket */
 struct sockaddr_in serv_addr; /* 服务器本机地址 */

 /* 建立socket */
 listen_sockFD=socket(AF_INET, SOCK_STREAM, 0);
 if(listen_sockFD == -1)
 {
  printf("Create socket error: %d/n", errno);
  exit(1);
 }

 memset(&serv_addr, 0x00, sizeof(serv_addr));
 serv_addr.sin_family=AF_INET;
 serv_addr.sin_port=htons(SERVPORT);
 serv_addr.sin_addr.s_addr=INADDR_ANY;  /* 可自动填入本机IP */
 memset(serv_addr.sin_zero, 0x00, sizeof(serv_addr.sin_zero));

 /* 强制类型转换sockaddr_in到sockaddr */
 if(bind(listen_sockFD, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr)) != 0)
 {
  printf("Bind socket error: %d/n", errno);
  exit(1);
 }

 /* 监听 */
 if(listen(listen_sockFD, BACKLOG) != 0)
 {
  printf("Listen socket error: %d/n", errno);
  exit(1);
 }

 int conn_sockFD;    /* 数据传输socket */
 struct sockaddr_in client_addr;   /* 客户端地址信息 */
 socklen_t clientLen=sizeof(client_addr); /* 客户端地址长度 */
 char buff[4096];    /* 数据存储区     */
 int recvLen=0;     /* 数据长度       */

 while(1)
 {
  conn_sockFD=accept(listen_sockFD, (struct sockaddr*)&client_addr, &clientLen);
  if(conn_sockFD == -1)
  {
   printf("Accept socket error: %d/n", errno);
   exit(1);
  }
  /***
  printf("client-family:[%d]/n", client_addr.sin_family);
  printf("client-port:[%d]/n", ntohs(client_addr.sin_port));
  printf("client-ip:[%d]/n", client_addr.sin_addr.s_addr);
  ***/

  /* 收取消息包前面的4个字节的长度值 */
  memset(buff, 0x00, sizeof(buff));
  recvLen=recv(conn_sockFD, buff, 4, 0);
  if(recvLen == -1)
  {
   printf("recv1 err=[%d]/n", errno);
   continue;
  }
  printf("head_recv:[%s]---[%d]/n", buff, recvLen);

  /* 以实际的长度值接收消息包        */
  recvLen=getAtoi(buff);
  if(recvLen == -1)
  {
   printf("illegal: [%s]/n", buff);
   continue;
  }
  memset(buff, 0x00, sizeof(buff));
  recvLen=recv(conn_sockFD, buff, recvLen, 0);
  if(recvLen == -1)
  {
   printf("recv2 err=[%d]/n", errno);
   continue;
  }
  printf("body_recv:[%s]---[%d]/n", buff, recvLen);
  close(conn_sockFD);
 } 
 close(listen_sockFD);

 return 0;
}

 

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVPORT 4444

int main(int argc, char* argv[])
{
 /* 建立socket */
 int sockFD;
 sockFD=socket(AF_INET, SOCK_STREAM, 0);
 if(sockFD == -1)
 {
  printf("Create socket error: %d/n", errno);
  exit(1);
 }

 struct sockaddr_in serv_addr;  /* 服务器地址 */
 socklen_t serv_addr_len=sizeof(serv_addr);

 memset(&serv_addr, 0x00, sizeof(serv_addr));
 serv_addr.sin_family=AF_INET;
 serv_addr.sin_port=htons(SERVPORT);
 serv_addr.sin_addr.s_addr=inet_addr("36.0.15.227");
 memset(serv_addr.sin_zero, 0x00, sizeof(serv_addr.sin_zero));

 /* 尝试连接服务器 */
 if(connect(sockFD, (struct sockaddr*)&serv_addr, serv_addr_len) != 0)
 {
  printf("Connect socket error: %d/n", errno);
  exit(1);
 }

 /* 待发送的信息 */
 char *sendMsg=argv[1];
 int  sendLen=strlen(sendMsg);
 printf("send len=[%d]/n", sendLen);
 char strSend[4096];
 memset(strSend, 0x00, sizeof(strSend));
 sprintf(strSend, "%04d%s", sendLen, sendMsg);
 /* 发送 */
 sendLen=send(sockFD, strSend, strlen(strSend), 0);
 if(sendLen<0)
 {
  printf("Send data erro: %d/n", errno);
  close(sockFD);
  exit(1);
 }
 
 close(sockFD);

 return 0;
}

抱歉!评论已关闭.