socket网络编程客户端和服务器端代码

服务器端代码

 1 /*服务器端*/
  2
  3 #include <stdio.h>
  4 #include <unistd.h>
  5 #include <string.h>
  6 #include <arpa/inet.h>
  7 #include <netinet/in.h>
  8 #include <errno.h>
  9 #include <sys/types.h>
 10 #include <sys/socket.h>
 11 #define BUF     "Hello client ,I'm server!"
 12
 13 int main(int argc, char **argv)
 14 {
 15         int server_fd = -1;
 16         int client_fd = -1;
 17         int rv = -1;
 18         int port = 9999;
 19         struct sockaddr_in server_addr;
 20         struct sockaddr_in client_addr;
 21         char buff[1024] = {};
 22         int on = 1;
 23         socklen_t *client_addrlen;
 24         server_fd = socket(AF_INET, SOCK_STREAM, 0);
 25         if(server_fd < 0)
 26         {
 27                 printf("create socket failure!\n");
 28                 return -1;
 29         }
 30         printf("create socket[%d]successfully!\n",server_fd);
 31
 32         setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
 33         memset(&server_addr, 0,sizeof(server_addr));
 34         server_addr.sin_family = AF_INET;
 35         server_addr.sin_port = htons(port);
 36         server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 37         rv = bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
 38         if(rv < 0)
 39         {
 40                 printf("server_fd[%d]bind[%d]failure:%s\n", server_fd,port,strerror(errno));
 41                 return -2;
 42			}

 43         printf("server_fd[%d]bind[%d]successfully!\n", server_fd,port);
 44
 45         if((listen(server_fd,13)) < 0)
 46         {
 47                 printf("server_fd[%d]listen[%d]failure:%s\n",server_fd, port,strerror(errno));
 48                 return -3;
 49         }
 50         printf("server_fd[%d]listen[%d]successfully!\n",server_fd, port);
 51
 52         while(1)
 53         {
 54                 printf("start accept new client connect······\n");
 55
 56                 memset(&client_addr,0,sizeof(client_addr));
 57                 memset(client_addrlen,0,sizeof(client_addrlen));
 58                 printf("1\n");
 59                 //当客户端连接服务器的时候,触发accept,accept从内核中拿出客户端的IP地址和h端口,将其放到client_addr这个结构体里面
 60                 client_fd = accept(server_fd,(struct sockaddr *)&client_addr,client_addrlen);
 61                 if(client_fd < 0)
 62                 {
 63                         //inet_ntoa函数返回的是点分十进制的字符串在静态内存中的指针,这里是将客户端的IP地址从client_addr这个结构体中拿出来,这里我们要知道clien    t_addr结构体是struct sockaddr_in类型的结构体
 64                         //ntohs函数作用是将一个16位数由网络字节顺序转换为主机字节顺序,这里是将我们客户端的端口转化为主机字节序
 65                         //这俩个函数刚好跟客户端代码里的inet_aton和htons相对应 ,功能相反。
 66                         printf("accept new client[%d][%s:%d]fail:%s\n",client_fd, inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),strerror(errno));
 67                         printf("%s\n",strerror(errno));
 68                         break;
 69                 }
 70                 printf("accept new client[%d][%s:%d]successfully!\n",client_fd, inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
 71                 memset(buff,0,sizeof(buff));
 72                 rv = read(client_fd, buff, sizeof(buff));
 73                 if(rv < 0)
 74                 {
 75                         printf("read data from client[%d]failure is:%s\n",client_fd,strerror(errno));
 76                         break;
 77                 }
 78                 printf("read data from client[%d]successful is :%s!\n",client_fd, buff);
 79
 80                 rv = write(client_fd, BUF, strlen(BUF));
 81                 if(rv < 0)
 82                 {
                                                                                                                                                 62,1-8        80%


客户端代码

1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <sys/types.h>
  4 #include <string.h>
  5 #include <errno.h>
  6 #include <arpa/inet.h>
  7 #include <sys/socket.h>
  8 #include <arpa/inet.h>
  9 #include <stdlib.h>
 10
 11 #define SEND_MSG        "hello server,I'm client"
 12
 13 int main(int argc, char **argv)
 14 {
 15         int socket_fd = -1;
 16         int rv = -1;
 17         struct sockaddr_in server_addr;
 18         char *server_ip;
 19         int PORT;
 20         char buff[1024]={};
 21
 22         server_ip = argv[1];
 23         PORT = atoi(argv[2]);
 24
 25         socket_fd = socket(AF_INET, SOCK_STREAM, 0 );
 26         if(socket < 0)
 27         {
 28                 printf("create socket_fd failure:%s\n",strerror(errno));
 29                 return -1;
 30         }
 31         printf("create socket_fd successfully!\n");
 32         memset(&server_addr, 0, sizeof(server_addr));
 33         server_addr.sin_family = AF_INET;               //使用是ipv4地址,所以用AF_INET
 34         server_addr.sin_port = htons(PORT);             //将端口转换为网络字节序
 35         inet_aton(server_ip, &server_addr.sin_addr);    //将server_ip所指向的十进制地址转换为网络地址
 36
 37         rv = connect(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
 38         if(rv < 0)
 39         {
 40                 printf("socket_fd[%d]connect[%s:%d] failure!\n",socket_fd,server_ip,PORT);
 41                 return -2;
 42         }
 43
 44         printf("connect[%s:%d]successfully\n",server_ip,PORT);
 45         rv = write(socket_fd, SEND_MSG, strlen(SEND_MSG));
 46         if(rv < 0)
 47         {
 48                 printf("Send data failure\n");
 49                 return -3;
 50         }
 51         printf("Send data successful:%s\n",SEND_MSG);
 52
 53         memset(&buff, 0, sizeof(buff));
 54         rv = read(socket_fd, buff, sizeof(buff)) ;
 55         if(rv < 0)
 56         {
 57                 printf("recv data from server failure!\n");
 58                 return -4;
 59         }
 60         else if(rv = 0)
 61         {
 62                 printf("disconnect\n");
 63                 return -5;
 64         }
 65
 66         printf("recv data from server is:%s\n",buff);
 67         close(socket_fd);
 68
 69 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值