两台pc机用一个socket通信,每个pc机创建两个线程一个发消息一个收消息 windows socket
2014-08-20 18:03
267 查看
//pc1
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")
HANDLE xinhao;
SOCKET sockConn;
DWORD WINAPI RecvProc(LPVOID lpParameter);
DWORD WINAPI ServerProc(LPVOID lpParameter);
void main(void)
{
HANDLE serverThread,recvThread;
xinhao=CreateSemaphore(NULL,1,1,NULL);
recvThread=CreateThread( NULL,0,RecvProc,NULL, 0,NULL);
serverThread=CreateThread( NULL,0,ServerProc,NULL, 0,NULL);
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 0);
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) !=2 ||HIBYTE( wsaData.wVersion ) != 0 )
{
WSACleanup( );
return ;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// 绑定端口
listen(sockSrv,10);
SOCKADDR_IN addrClient;// 连接上的客户端ip地址
int len=sizeof(SOCKADDR);
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 接受客户端连接,获取客户端的ip地址
// Sleep(5000);
// Sleep(5000);
CloseHandle(serverThread);
CloseHandle(recvThread);
CloseHandle(xinhao);
closesocket(sockConn);
WSACleanup();
getchar();
return ;
}
DWORD WINAPI RecvProc(LPVOID lpParameter)
{
char recvBuf[100];
while(1)
{
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
memset(recvBuf,0x20,100);
ReleaseSemaphore(xinhao,1,NULL);
}
return 0;
}
DWORD WINAPI ServerProc(LPVOID lpParameter)
{
char sendBuf[100]="发送到pc2";
while(1)
{
WaitForSingleObject(xinhao,INFINITE);
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
}
return 0;
}
//pc2
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")
HANDLE xinhao;
DWORD WINAPI RecvProc(LPVOID lpParameter);
DWORD WINAPI ServerProc(LPVOID lpParameter);
SOCKET sockClient;
void main(void)
{
HANDLE serverThread,recvThread;
xinhao=CreateSemaphore(NULL,1,1,NULL);
serverThread=CreateThread( NULL,0,ServerProc,NULL,0,NULL);
recvThread=CreateThread( NULL,0,RecvProc,NULL, 0,NULL);
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) !=2 ||HIBYTE( wsaData.wVersion ) != 0 )
{
WSACleanup();
return ;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR_IN));
// Sleep(5000);
// Sleep(5000);
CloseHandle(serverThread);
CloseHandle(recvThread);
CloseHandle(xinhao);
closesocket(sockClient);
WSACleanup();
getchar();
return ;
}
DWORD WINAPI ServerProc(LPVOID lpParameter)
{
char sendBuf[100]="发送到pc1";
while(1)
{
WaitForSingleObject(xinhao,INFINITE);
send(sockClient,sendBuf,strlen(sendBuf)+1,0);
}
return 0;
}
DWORD WINAPI RecvProc(LPVOID lpParameter)
{
char recvBuf[100];
while(1)
{
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
ReleaseSemaphore(xinhao,1,NULL);
memset(recvBuf,0x20,100);
}
return 0;
}
------解决方案--------------------
要在accept成功后才能recv
你一开始就创建线程recv,都还没accept,还有WSAStartup可能都没执行完
recv肯定失败了
------解决方案--------------------
在你的全局定义中SOCKET sockConn;改成SOCKET sockConn=NULL;
在你的代码中,SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 接受客户端连接,获取客户端的ip地址
sockConn再次定义了,此时全局的sockConn被覆盖了,你accept得到的客户端线程无法使用
在两个子线程的while中添加
Sleep(1); //释放系统控制权,以免CPU占用率100%
if(sockConn==NULL)
{
continue;
}
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")
HANDLE xinhao;
SOCKET sockConn;
DWORD WINAPI RecvProc(LPVOID lpParameter);
DWORD WINAPI ServerProc(LPVOID lpParameter);
void main(void)
{
HANDLE serverThread,recvThread;
xinhao=CreateSemaphore(NULL,1,1,NULL);
recvThread=CreateThread( NULL,0,RecvProc,NULL, 0,NULL);
serverThread=CreateThread( NULL,0,ServerProc,NULL, 0,NULL);
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 0);
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) !=2 ||HIBYTE( wsaData.wVersion ) != 0 )
{
WSACleanup( );
return ;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));// 绑定端口
listen(sockSrv,10);
SOCKADDR_IN addrClient;// 连接上的客户端ip地址
int len=sizeof(SOCKADDR);
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 接受客户端连接,获取客户端的ip地址
// Sleep(5000);
// Sleep(5000);
CloseHandle(serverThread);
CloseHandle(recvThread);
CloseHandle(xinhao);
closesocket(sockConn);
WSACleanup();
getchar();
return ;
}
DWORD WINAPI RecvProc(LPVOID lpParameter)
{
char recvBuf[100];
while(1)
{
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
memset(recvBuf,0x20,100);
ReleaseSemaphore(xinhao,1,NULL);
}
return 0;
}
DWORD WINAPI ServerProc(LPVOID lpParameter)
{
char sendBuf[100]="发送到pc2";
while(1)
{
WaitForSingleObject(xinhao,INFINITE);
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
}
return 0;
}
//pc2
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")
HANDLE xinhao;
DWORD WINAPI RecvProc(LPVOID lpParameter);
DWORD WINAPI ServerProc(LPVOID lpParameter);
SOCKET sockClient;
void main(void)
{
HANDLE serverThread,recvThread;
xinhao=CreateSemaphore(NULL,1,1,NULL);
serverThread=CreateThread( NULL,0,ServerProc,NULL,0,NULL);
recvThread=CreateThread( NULL,0,RecvProc,NULL, 0,NULL);
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) !=2 ||HIBYTE( wsaData.wVersion ) != 0 )
{
WSACleanup();
return ;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR_IN));
// Sleep(5000);
// Sleep(5000);
CloseHandle(serverThread);
CloseHandle(recvThread);
CloseHandle(xinhao);
closesocket(sockClient);
WSACleanup();
getchar();
return ;
}
DWORD WINAPI ServerProc(LPVOID lpParameter)
{
char sendBuf[100]="发送到pc1";
while(1)
{
WaitForSingleObject(xinhao,INFINITE);
send(sockClient,sendBuf,strlen(sendBuf)+1,0);
}
return 0;
}
DWORD WINAPI RecvProc(LPVOID lpParameter)
{
char recvBuf[100];
while(1)
{
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
ReleaseSemaphore(xinhao,1,NULL);
memset(recvBuf,0x20,100);
}
return 0;
}
------解决方案--------------------
要在accept成功后才能recv
你一开始就创建线程recv,都还没accept,还有WSAStartup可能都没执行完
recv肯定失败了
------解决方案--------------------
在你的全局定义中SOCKET sockConn;改成SOCKET sockConn=NULL;
在你的代码中,SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); // 接受客户端连接,获取客户端的ip地址
sockConn再次定义了,此时全局的sockConn被覆盖了,你accept得到的客户端线程无法使用
在两个子线程的while中添加
Sleep(1); //释放系统控制权,以免CPU占用率100%
if(sockConn==NULL)
{
continue;
}
相关文章推荐
- 关于Windows Socket是不是一个线程的多个Socket共享消息泵
- socket实现群聊---为每个客户端创建一个线程
- 网络编程之TCP通信,为什么在Serve端为每个Client端开辟一个单独的线程来处理Client的请求
- windows每个线程一个消息队列吗?
- MFC创建线程,消息通信修改
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- 1004编写一个程序,创建0~4共5个线程,然后每个线程输出一个hello
- CreateThread(NULL, 0, ClientThread, (LPVOID)sClient, 0, &dwThreadId);//每个客户端创建一个接收线程
- QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)
- 关于Socket通信中多个线程同时向一个服务端口发送数据时的注意点
- CompletionService 为每个图片创建一个线程下载
- 一个线程创建之初是没有消息队列的
- UNIX网络编程卷1 服务器程序设计范式6 并发服务器,为每个客户请求创建一个线程
- android socket通信 创建线程接受 客户端
- 2.每获取一个socket,就创建一个线程用于处理这个socket。
- FAQ12:每个线程一个消息队列?还是线程中的每个窗口各有一个消息队列?
- 写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。要求用线程间的通信
- Android异步通信机制简单地理解,Handler是当前线程的消息队列中的一个子队列,而Runable是可以被安排到Handler去运行的接口。 首先在Activity中创建一个继承自Han
- rocketmq 两个线程同时消费一个消息