C语言编写Socket监听处理程序一例

//C语言编写Socket监听处理程序一例 //服务器端 //-------------------------------------------------------------------------------------------- #include <winsock2.h> #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <fstream> #include <iostream> #include <ole2.h> #include <conio.h> #pragma comment(lib,"WS2_32.lib") #define MAX_PENDING_CONNECTS 4 //声明函数 void tt(void); DWORD WINAPI HandleSocket(LPVOID lpParam); //程序入口点 int _tmain(int argc, _TCHAR* argv[]) { tt(); //stop screen method 1 char q; cin>>q; //stop screen method 2 //getchar(); return 0; } //#include <winsock2.h> //放在最顶端的.h中开头处 //#include <stdio.h> //#include <stdlib.h> //#pragma comment(lib,"WS2_32.lib") void tt(void) { WORD wVersionRequested; WSADATA wsaData; int err; //版本请求 wVersionRequested = MAKEWORD( 1, 1 ); //初始化WinSock(WSAStartup函数) err = WSAStartup( wVersionRequested, &wsaData); if ( err != 0 ) { //初始化出错了退出函数 return; } //初始化成功!但版本不一致! 退出函数 if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); //清除Socket return; //退出函数 } //生成一个socket(sockSrv变量) //SOCK_STREAM 用于TCP协议 //SOCK_DGRAM 用于UDP协议 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //使用TCP协议 //设置一个地址Socket(addrSrv变量) SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.232"); //本机IP地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); //端口6000 //绑定函数(指定本地IP地址所使用的端口号时候使用) //(把sockSrv变量与addrSrv变量绑定在一起) bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //监听端口开始 if(listen(sockSrv,MAX_PENDING_CONNECTS)!=0) { printf("listen(sock) failed: %d\n ",::WSAGetLastError()); return;//ExitProcess(STATUS_FAILED); } printf("开始监听..."); //接收来自客户端的请求连接 SOCKET sockClient; SOCKADDR_IN addrClient;//定义一个客户端Socket地址 int len=sizeof(SOCKADDR); char recvBuf[100]; int recv_len=-1; // sockaddr_in acc_sin; int acc_sin_len; acc_sin_len=sizeof(acc_sin); // while(true) { //接收Socket请求 来自客户端的Connect sockClient=accept(sockSrv,(struct sockaddr*)&acc_sin, &acc_sin_len); if(sockClient>=0) { //创建一个线程来处理socket请求threadHandle DWORD id; HANDLE threadHandle = CreateThread(0, 0,(LPTHREAD_START_ROUTINE)HandleSocket,(LPVOID)sockClient, 0, &id); 接收数据并保存到recvBuf变量中 //recv_len=recv(sockClient,recvBuf,100,0); recv_len=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); //while(recv_len>=0) //{ // if (recv_len==0) // { // printf("本次接收的没有数据,是响应客户端连接信息!\n "); // } // else // { // //输出数据 // recvBuf[recv_len]='\0'; //在末尾加入字符串结束符号 '\0 ' // printf("%s\n",recvBuf); // printf("本次数据接收结束。\n "); // } // recv_len=recv(sockClient,recvBuf,100,0);//recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); //} } else { //没有客户端接入 printf("没有客户端接入2\n"); } Sleep(200); } //关闭Socket变量sockSrv closesocket(sockSrv); //清除Socket WSACleanup(); } DWORD WINAPI HandleSocket(LPVOID lpParam) { SOCKET sockClient=(SOCKET)lpParam; //接收数据并保存到recvBuf变量中 char recvBuf[100]; int recv_len=-1; while(1) { recv_len=recv(sockClient,recvBuf,100,0); //recv_len=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); if(recv_len>=0) { if (recv_len==0) { printf("本次接收的没有数据,是响应客户端连接信息!\n "); } else { //输出数据 recvBuf[recv_len]='\0'; //在末尾加入字符串结束符号 '\0 ' printf("%s\n",recvBuf); printf("本次数据接收结束。\n "); } //recv_len=recv(sockClient,recvBuf,100,0);//recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); } } } //客户端 //-------------------------------------------------------------------------------------------- #pragma once #include <winsock2.h> #include <stdio.h> #include <stdlib.h> #include "targetver.h" #include <tchar.h> #include <fstream> #include <iostream> #include <ole2.h> #include <conio.h> using namespace std; #include "string.h" #pragma comment(lib,"WS2_32.lib") void SendMessage(void); int _tmain(int argc, _TCHAR* argv[]) { SendMessage(); char q; cin>>q; return 0; } void SendMessage(void) { WORD wVersionRequested; WSADATA wsaData; int err; //版本请求 wVersionRequested = MAKEWORD( 1, 1 ); //初始化WinSock(WSAStartup函数) err = WSAStartup( wVersionRequested, &wsaData); if ( err != 0 ) { //初始化出错了退出函数 return; } //初始化成功!但版本不一致! 退出函数 if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); //清除Socket return; //退出函数 } //生成一个socket(sockSrv变量) //SOCK_STREAM 用于TCP协议 //SOCK_DGRAM 用于UDP协议 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //使用TCP协议 //设置一个地址Socket(addrSrv变量) SOCKADDR_IN addrSrv; memset(&addrSrv,0,sizeof(addrSrv)); addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.232");//要访问的IP地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); //端口6000 //绑定函数(指定本地IP地址所使用的端口号时候使用) //(把sockSrv变量与addrSrv变量绑定在一起) bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); if(connect(sockSrv, (sockaddr*)&addrSrv,sizeof( addrSrv ) ) != SOCKET_ERROR ) { int i=0; char strch[]={ "Client send OK!(from Client) "}; while(true) { //strch[strlen(strch)]=i; if(send(sockSrv,strch,strlen(strch),0)==SOCKET_ERROR) { printf("WSAGetLastError: %d\n ",WSAGetLastError()); } else { printf(strch);printf("\n"); } Sleep(300); } } else { printf("没连上!\n"); } //关闭Socket变量sockSrv closesocket(sockSrv); //清除Socket WSACleanup(); printf("已退出SendMessage函数!\n"); } -----the----end-----

转载于:https://www.cnblogs.com/sqlite3/archive/2011/11/14/2566783.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值