用C语言进行最基本的socket编程
什么是socket 简单的发送和接收实现 服务器端接收代码: #include <Winsock2.h> #pragma comment(lib,"Ws2_32.lib") #include <stdio.h> #include <memory.h> void main() { WSAData wsd; WSAStartup(MAKEWORD(2,0),&wsd); SOCKET s =NULL; s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); struct sockaddr_in ch; memset(&ch,sizeof(ch)); ch.sin_family=AF_INET; ch.sin_addr.s_addr=INADDR_ANY; ch.sin_port=htons(1041); int b=bind(s,(struct sockaddr *) &ch,sizeof(ch)); #define QUEUE_SIZE 5 int l=listen(s,QUEUE_SIZE); printf("正在监听本机的1041端口!n"); SOCKET sc=accept(s,0); printf("客户端已经连接到本机的1041端口!n"); #define BUF_SIZE 4096 int receByt=0; while(1) { char buf[BUF_SIZE]; receByt=recv(sc,buf,BUF_SIZE,0); buf[receByt]=' '; if(receByt>0) { printf("接收的消息是:%sn",buf); } else { printf("接收消息结束!"); break; } } int ic=closesocket(sc); int is=closesocket(s); } 客户端发送的代码: #include <Winsock2.h> #pragma comment(lib,"Ws2_32.lib") #include <stdio.h> #include <memory.h> #include <string.h> void main() { WSAData wsd; WSAStartup(MAKEWORD(2,sizeof(ch)); ch.sin_family=AF_INET; ch.sin_addr.s_addr=inet_addr("127.0.0.1"); ch.sin_port=htons(1041); int c=connect(s,sizeof(ch)); printf("已经连接到服务器的1041端口!现在可以向服务器发送消息了!n"); #define BUF_SIZE 4096 char info[1024],buf[BUF_SIZE]; while(1) { gets(info); if(info[0]==' ') break; strcpy(buf,info); int nsend=send(s,strlen(buf),0); } int ic=closesocket(s); } 程序代码经过了优化,并且整合多线程,把接收和发送放到同一个文件中,使用参数模式调用发送和接收模块。增加了创建SOCKET的创建的时候s句柄(或对象)判断返回值是否为INVALID_SOCKET,以及socket的bind操作的返回值是否为SOCKET_ERROR,其他socket的操作应该也判断SOCKET_ERROR,以保证程序的稳定性,这里只是测试代码就不去写这么多了,剩下的就由你个人发挥。 #include <Winsock2.h> #pragma comment(lib,"Ws2_32.lib") #include <stdio.h> #include <memory.h> #include <string.h> #include <pthread.h> void Receive(); void Send(); void creatThread(); SOCKET s =NULL; pthread_t t[1000]; int threadCount=0; void main(int argc,char* argv[]) { printf("本程序制作人学号:713901040041n"); printf("程序说明:服务器端和客户端为同一个程序,请使用不同的参数运行.n"); printf("接收程序请使用 r参数;发送程序请使用 s参数。n"); //printf("len : %dn",argc); //printf("count %dn",argc); //printf("value: %sn",argv[1]); //printf("%d",argv[1][0]=='r'); if(argc<=1) { printf("please input program arguments ...n"); exit(0); } if(argc>1 && argv[1][0]=='r') { printf("run receive ...n"); Receive(); } if(argc>1 && argv[1][0]=='s') { printf("run send ...n"); Send(); } } void* receiveWork(void * args) { SOCKET sc=accept(s,0); if(sc==INVALID_SOCKET) { printf("sc Error"); } creatThread(); printf("----------客户端已经连接到本机的%d线程连接!n",threadCount-2); #define BUF_SIZE 4096 int receByt=0; while(1) { char buf[BUF_SIZE]; receByt=recv(sc,0); buf[receByt]=' '; if(receByt>0) { printf("线程接收的消息是:%sn",buf); } else { printf("客户端已退出,"); break; } } int ic=closesocket(sc); printf("服务器结束连接!n"); return NULL; } void creatThread() { pthread_create(&t[threadCount++],NULL,receiveWork,NULL); } void Receive() { WSAData wsd; WSAStartup(MAKEWORD(2,&wsd); s=socket(AF_INET,IPPROTO_TCP); if(s==INVALID_SOCKET) { printf("socket created Error"); } struct sockaddr_in ch; memset(&ch,sizeof(ch)); ch.sin_family=AF_INET; ch.sin_addr.s_addr=INADDR_ANY; ch.sin_port=htons(1041); int b=bind(s,sizeof(ch)); if(b==SOCKET_ERROR) { printf("bind 失败,出错代码是:%dn",WSAGetLastError()); exit(0); } #define QUEUE_SIZE 5 int l=listen(s,QUEUE_SIZE); printf("正在监听本机的1041端口!n"); creatThread(); for(int i=0;i<1000;i++) { pthread_join(t[i],NULL); } int is=closesocket(s); } void Send() { WSAData wsd; WSAStartup(MAKEWORD(2,&wsd); SOCKET s =NULL; s=socket(AF_INET,sizeof(ch)); ch.sin_family=AF_INET; ch.sin_addr.s_addr=inet_addr("127.0.0.1"); ch.sin_port=htons(1041); int c=connect(s,sizeof(ch)); printf("已经连接到服务器的1041端口!现在可以向服务器发送消息了!n"); #define BUF_SIZE 4096 char info[1024],buf[BUF_SIZE]; while(1) { gets(info); if(info[0]==' ') break; strcpy(buf,info); int nsend=send(s,0); } int ic=closesocket(s); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |