linux下C/C++ socket编程

简单的linux下socket编程,分别基于TCP和UDP协议实现的简单程序

 

linux下socket编程可以概括为以下几个函数的运用:

 

  • socket()

  • bind()

  • listen()

  • connect()

  • accept()

  • read()

  • write()

  • close()函数

 

基于TCP实现

流程

server代码

 

 
  1. #include <stdio.h>

  2. #include <sys/types.h>

  3. #include <sys/socket.h>

  4. #include <netinet/in.h>

  5. #include <arpa/inet.h>

  6.  
  7.  
  8. int main(int argc, char *argv[])

  9. {

  10. int server_sockfd;//服务器端套接字

  11. int client_sockfd;//客户端套接字

  12. int len;

  13. struct sockaddr_in my_addr; //服务器网络地址结构体

  14. struct sockaddr_in remote_addr; //客户端网络地址结构体

  15. int sin_size;

  16. char buf[BUFSIZ]; //数据传送的缓冲区

  17. memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零

  18. my_addr.sin_family=AF_INET; //设置为IP通信

  19. my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上

  20. my_addr.sin_port=htons(8000); //服务器端口号

  21.  
  22. /*创建服务器端套接字--IPv4协议,面向连接通信,TCP协议*/

  23. if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)

  24. {

  25. perror("socket error");

  26. return 1;

  27. }

  28.  
  29.  
  30. /*将套接字绑定到服务器的网络地址上*/

  31. if(bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)

  32. {

  33. perror("bind error");

  34. return 1;

  35. }

  36.  
  37. /*监听连接请求--监听队列长度为5*/

  38. if(listen(server_sockfd,5)<0)

  39. {

  40. perror("listen error");

  41. return 1;

  42. };

  43.  
  44. sin_size=sizeof(struct sockaddr_in);

  45.  
  46. /*等待客户端连接请求到达*/

  47. if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)

  48. {

  49. perror("accept error");

  50. return 1;

  51. }

  52. printf("accept client %s/n",inet_ntoa(remote_addr.sin_addr));

  53. len=send(client_sockfd,"Welcome to my server/n",21,0);//发送欢迎信息

  54.  
  55. /*接收客户端的数据并将其发送给客户端--recv返回接收到的字节数,send返回发送的字节数*/

  56. while((len=recv(client_sockfd,buf,BUFSIZ,0))>0))

  57. {

  58. buf[len]='/0';

  59. printf("%s/n",buf);

  60. if(send(client_sockfd,buf,len,0)<0)

  61. {

  62. perror("write error");

  63. return 1;

  64. }

  65. }

  66.  
  67.  
  68. /*关闭套接字*/

  69. close(client_sockfd);

  70. close(server_sockfd);

  71.  
  72. return 0;

  73. }


client代码

 

 
  1. #include <stdio.h>

  2. #include <sys/types.h>

  3. #include <sys/socket.h>

  4. #include <netinet/in.h>

  5. #include <arpa/inet.h>

  6.  
  7. int main(int argc, char *argv[])

  8. {

  9. int client_sockfd;

  10. int len;

  11. struct sockaddr_in remote_addr; //服务器端网络地址结构体

  12. char buf[BUFSIZ]; //数据传送的缓冲区

  13. memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零

  14. remote_addr.sin_family=AF_INET; //设置为IP通信

  15. remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址

  16. remote_addr.sin_port=htons(8000); //服务器端口号

  17.  
  18. /*创建客户端套接字--IPv4协议,面向连接通信,TCP协议*/

  19. if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)

  20. {

  21. perror("socket error");

  22. return 1;

  23. }

  24.  
  25. /*将套接字绑定到服务器的网络地址上*/

  26. if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)

  27. {

  28. perror("connect error");

  29. return 1;

  30. }

  31. printf("connected to server/n");

  32. len=recv(client_sockfd,buf,BUFSIZ,0);//接收服务器端信息

  33. buf[len]='/0';

  34. printf("%s",buf); //打印服务器端信息

  35.  
  36. /*循环的发送接收信息并打印接收信息(可以按需发送)--recv返回接收到的字节数,send返回发送的字节数*/

  37. while(1)

  38. {

  39. printf("Enter string to send:");

  40. scanf("%s",buf);

  41. if(!strcmp(buf,"quit")

  42. break;

  43. len=send(client_sockfd,buf,strlen(buf),0);

  44. len=recv(client_sockfd,buf,BUFSIZ,0);

  45. buf[len]='/0';

  46. printf("received:%s/n",buf);

  47. }

  48.  
  49. /*关闭套接字*/

  50. close(client_sockfd);

  51.  
  52. return 0;

  53. }

 

 

基于UDP实现

流程

 

 

server代码

 

 
  1. #include <stdio.h>

  2. #include <sys/types.h>

  3. #include <sys/socket.h>

  4. #include <netinet/in.h>

  5. #include <arpa/inet.h>

  6.  
  7. int main(int argc, char *argv[])

  8. {

  9. int server_sockfd;

  10. int len;

  11. struct sockaddr_in my_addr; //服务器网络地址结构体

  12. struct sockaddr_in remote_addr; //客户端网络地址结构体

  13. int sin_size;

  14. char buf[BUFSIZ]; //数据传送的缓冲区

  15. memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零

  16. my_addr.sin_family=AF_INET; //设置为IP通信

  17. my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上

  18. my_addr.sin_port=htons(8000); //服务器端口号

  19.  
  20. /*创建服务器端套接字--IPv4协议,面向无连接通信,UDP协议*/

  21. if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)

  22. {

  23. perror("socket error");

  24. return 1;

  25. }

  26.  
  27. /*将套接字绑定到服务器的网络地址上*/

  28. if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)

  29. {

  30. perror("bind error");

  31. return 1;

  32. }

  33. sin_size=sizeof(struct sockaddr_in);

  34. printf("waiting for a packet.../n");

  35.  
  36. /*接收客户端的数据并将其发送给客户端--recvfrom是无连接的*/

  37. if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)

  38. {

  39. perror("recvfrom error");

  40. return 1;

  41. }

  42. printf("received packet from %s:/n",inet_ntoa(remote_addr.sin_addr));

  43. buf[len]='/0';

  44. printf("contents: %s/n",buf);

  45.  
  46. /*关闭套接字*/

  47. close(server_sockfd);

  48.  
  49. return 0;

  50. }

 

 

client代码

 

 
  1. #include <stdio.h>

  2. #include <sys/types.h>

  3. #include <sys/socket.h>

  4. #include <netinet/in.h>

  5. #include <arpa/inet.h>

  6.  
  7. int main(int argc, char *argv[])

  8. {

  9. int client_sockfd;

  10. int len;

  11. struct sockaddr_in remote_addr; //服务器端网络地址结构体

  12. int sin_size;

  13. char buf[BUFSIZ]; //数据传送的缓冲区

  14. memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零

  15. remote_addr.sin_family=AF_INET; //设置为IP通信

  16. remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址

  17. remote_addr.sin_port=htons(8000); //服务器端口号

  18.  
  19. /*创建客户端套接字--IPv4协议,面向无连接通信,UDP协议*/

  20. if((client_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)

  21. {

  22. perror("socket error");

  23. return 1;

  24. }

  25. strcpy(buf,"This is a test message"); // 发送的内容

  26. printf("sending: '%s'/n",buf);

  27. sin_size=sizeof(struct sockaddr_in);

  28.  
  29. /*向服务器发送数据包*/

  30. if((len=sendto(client_sockfd,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr)))<0)

  31. {

  32. perror("recvfrom");

  33. return 1;

  34. }

  35.  
  36. /*关闭套接字*/

  37. close(client_sockfd);

  38.  
  39. return 0;

  40. }

在linux下用gcc运行即可

--------------------- 本文来自 踏莎行hyx 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u012234115/article/details/54142273?utm_source=copy

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值