1. 程式人生 > >linux下C/C++ socket程式設計

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. int main(int argc, char *argv[])

  7. {

  8. int server_sockfd;//伺服器端套接字

  9. int client_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. /*建立伺服器端套接字--IPv4協議,面向連線通訊,TCP協議*/

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

  21. {

  22. perror("socket error");

  23. return 1;

  24. }

  25. /*將套接字繫結到伺服器的網路地址上*/

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

  27. {

  28. perror("bind error");

  29. return 1;

  30. }

  31. /*監聽連線請求--監聽佇列長度為5*/

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

  33. {

  34. perror("listen error");

  35. return 1;

  36. };

  37. sin_size=sizeof(struct sockaddr_in);

  38. /*等待客戶端連線請求到達*/

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

  40. {

  41. perror("accept error");

  42. return 1;

  43. }

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

  45. len=send(client_sockfd,"Welcome to my server/n",21,0);//傳送歡迎資訊

  46. /*接收客戶端的資料並將其傳送給客戶端--recv返回接收到的位元組數,send返回傳送的位元組數*/

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

  48. {

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

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

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

  52. {

  53. perror("write error");

  54. return 1;

  55. }

  56. }

  57. /*關閉套接字*/

  58. close(client_sockfd);

  59. close(server_sockfd);

  60. return 0;

  61. }

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. int main(int argc, char *argv[])

  7. {

  8. int client_sockfd;

  9. int len;

  10. struct sockaddr_in remote_addr; //伺服器端網路地址結構體

  11. char buf[BUFSIZ]; //資料傳送的緩衝區

  12. memset(&remote_addr,0,sizeof(remote_addr)); //資料初始化--清零

  13. remote_addr.sin_family=AF_INET; //設定為IP通訊

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

  15. remote_addr.sin_port=htons(8000); //伺服器埠號

  16. /*建立客戶端套接字--IPv4協議,面向連線通訊,TCP協議*/

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

  18. {

  19. perror("socket error");

  20. return 1;

  21. }

  22. /*將套接字繫結到伺服器的網路地址上*/

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

  24. {

  25. perror("connect error");

  26. return 1;

  27. }

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

  29. len=recv(client_sockfd,buf,BUFSIZ,0);//接收伺服器端資訊

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

  31. printf("%s",buf); //列印伺服器端資訊

  32. /*迴圈的傳送接收資訊並列印接收資訊(可以按需傳送)--recv返回接收到的位元組數,send返回傳送的位元組數*/

  33. while(1)

  34. {

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

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

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

  38. break;

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

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

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

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

  43. }

  44. /*關閉套接字*/

  45. close(client_sockfd);

  46. return 0;

  47. }

基於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. int main(int argc, char *argv[])

  7. {

  8. int server_sockfd;

  9. int len;

  10. struct sockaddr_in my_addr; //伺服器網路地址結構體

  11. struct sockaddr_in remote_addr; //客戶端網路地址結構體

  12. int sin_size;

  13. char buf[BUFSIZ]; //資料傳送的緩衝區

  14. memset(&my_addr,0,sizeof(my_addr)); //資料初始化--清零

  15. my_addr.sin_family=AF_INET; //設定為IP通訊

  16. my_addr.sin_addr.s_addr=INADDR_ANY;//伺服器IP地址--允許連線到所有本地地址上

  17. my_addr.sin_port=htons(8000); //伺服器埠號

  18. /*建立伺服器端套接字--IPv4協議,面向無連線通訊,UDP協議*/

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

  20. {

  21. perror("socket error");

  22. return 1;

  23. }

  24. /*將套接字繫結到伺服器的網路地址上*/

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

  26. {

  27. perror("bind error");

  28. return 1;

  29. }

  30. sin_size=sizeof(struct sockaddr_in);

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

  32. /*接收客戶端的資料並將其傳送給客戶端--recvfrom是無連線的*/

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

  34. {

  35. perror("recvfrom error");

  36. return 1;

  37. }

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

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

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

  41. /*關閉套接字*/

  42. close(server_sockfd);

  43. return 0;

  44. }

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. int main(int argc, char *argv[])

  7. {

  8. int client_sockfd;

  9. int len;

  10. struct sockaddr_in remote_addr; //伺服器端網路地址結構體

  11. int sin_size;

  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. /*建立客戶端套接字--IPv4協議,面向無連線通訊,UDP協議*/

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

  19. {

  20. perror("socket error");

  21. return 1;

  22. }

  23. strcpy(buf,"This is a test message"); // 傳送的內容

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

  25. sin_size=sizeof(struct sockaddr_in);

  26. /*向伺服器傳送資料包*/

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

  28. {

  29. perror("recvfrom");

  30. return 1;

  31. }

  32. /*關閉套接字*/

  33. close(client_sockfd);

  34. return 0;

  35. }

在linux下用gcc執行即可

--------------------- 本文來自 踏莎行hyx 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/u012234115/article/details/54142273?utm_source=copy