C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例
更新時間:2016年03月15日 14:52:25 作者:陳仲陽0
這篇文章主要介紹了C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶端與服務(wù)器端采用多線程實現(xiàn),需要的朋友可以參考下
Tcp多線程服務(wù)器和客戶端程序
服務(wù)器程序:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 char buf[BUFSIZE+1]; void* fun(void* x) { //printf("enter thread!\r\n"); int new_fd=*((int*)x); while(1) { int z=read(new_fd,buf,BUFSIZE);//第 6 步 讀取套接字 if(z==0){printf("client close !");break;}; buf[z]='\0'; printf("%s\r\n",buf);//打印 }; } int newfd[512]; int inewfd=0; int main() { //第 1 步 創(chuàng)建套接字 int sockfd=socket(AF_INET,SOCK_STREAM,0); //第 2 步 設(shè)置地址結(jié)構(gòu)體 struct sockaddr_in svraddr; svraddr.sin_family=AF_INET;//使用 internet 協(xié)議 svraddr.sin_port=htons(PORT); inet_aton("0.0.0.0",&svraddr.sin_addr); //第 3 步 綁定 int ret=bind(sockfd,(struct sockaddr*)&svraddr,sizeof(svraddr)); if(ret<0){printf("error bind!\r\n");exit(-1);}; //第 4 步 監(jiān)聽 listen(sockfd,128); while(1) { newfd[inewfd++]=accept(sockfd,NULL,NULL); //第 5 步 接收 pthread_t ntid; pthread_create(&ntid,NULL,fun,(void*)&(newfd[inewfd-1])); } }
注意:
gcc server.c -o server -lpthread
客戶端程序 cli.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 char buf[BUFSIZE+1]; int main() { //第 1 步 創(chuàng)建一個體套接字 int sockfd=socket(AF_INET,SOCK_STREAM,0); //第 2 步 設(shè)置 addr 結(jié)構(gòu)體 struct sockaddr_in svraddr; svraddr.sin_family=AF_INET;//使用 internet 協(xié)議 svraddr.sin_port=htons(PORT); inet_aton("127.0.0.1",&svraddr.sin_addr); //第 3 步 連接服務(wù)器 connect(sockfd,(struct sockaddr*)&svraddr,sizeof(svraddr)); while(1) { scanf("%s",buf); write(sockfd,buf,strlen(buf)); //第 4 步 向套接字中寫入字符串 } }
Udp的服務(wù)器程序和客戶端程序
服務(wù)器程序:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 char buf[BUFSIZE+1]; int main() { //第 1 步 創(chuàng)建套接字 int sockfd=socket(AF_INET,SOCK_DGRAM,0); //第 2 步 設(shè)置地址結(jié)構(gòu)體 struct sockaddr_in svraddr; svraddr.sin_family=AF_INET;//使用 internet 協(xié)議 svraddr.sin_port=htons(PORT); inet_aton("0.0.0.0",&svraddr.sin_addr); //第 3 步 綁定 int ret=bind(sockfd,(struct sockaddr*)&svraddr,sizeof(svraddr)); if(ret<0){printf("cannot bind!\r\n");exit(-1);}; while(1) { struct sockaddr_in cli; int len=sizeof(cli); int z=recvfrom(sockfd,buf,BUFSIZE,0,(struct sockaddr*)&cli,&len);//第 6 步 讀取套接字 buf[z]='\0'; printf("%s\r\n",buf);//打印 } }
客戶端程序 cli.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 char buf[BUFSIZE+1]; int main() { //第 1 步 創(chuàng)建一個體套接字 int sockfd=socket(AF_INET,SOCK_DGRAM,0); //第 2 步 設(shè)置 addr 結(jié)構(gòu)體 struct sockaddr_in svraddr; svraddr.sin_family=AF_INET;//使用 internet 協(xié)議 svraddr.sin_port=htons(PORT); inet_aton("127.0.0.1",&svraddr.sin_addr); //第 3 步 連接服務(wù)器 //connect(sockfd,(struct sockaddr*)&svraddr,sizeof(svraddr)); while(1) { scanf("%s",buf); sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&svraddr,sizeof(svraddr)); //第 4 步 向套接字中寫入字符串 } }
相關(guān)文章
C++將二叉樹轉(zhuǎn)為雙向鏈表及判斷兩個鏈表是否相交
這篇文章主要介紹了C++將二叉樹轉(zhuǎn)為雙向鏈表及判斷兩個鏈表是否相交的方法,文中還給出了求兩個鏈表相交的第一個節(jié)點列的實現(xiàn)方法,需要的朋友可以參考下2016-02-02Visual Studio 2022最新版安裝教程(圖文詳解)
本文主要介紹了Visual Studio 2022最新版安裝教程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01C++線程優(yōu)先級SetThreadPriority的使用實例
這篇文章主要介紹了C++線程優(yōu)先級SetThreadPriority的使用實例,較為詳細的講述了C++線程及其優(yōu)先級的用法,需要的朋友可以參考下2014-10-10