两台pc机用一个socket通信,每个pc机创建两个线程一个发消息一个收消息 windows socket
来源:互联网 发布:重庆大学网络教育费用 编辑:程序博客网 时间:2024/05/09 20:47
//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;
}
0 0
- 两台pc机用一个socket通信,每个pc机创建两个线程一个发消息一个收消息 windows socket
- windows每个线程一个消息队列吗?
- 关于Windows Socket是不是一个线程的多个Socket共享消息泵
- 一个关于PC机通信软件设计
- socket实现群聊---为每个客户端创建一个线程
- Socket通信,PC-pc,pc-Android
- FAQ12:每个线程一个消息队列?还是线程中的每个窗口各有一个消息队列?
- android开发之socket通信 向PC机发信息 获取本机IP
- android开发之socket通信 向PC机发信息 获取本机IP
- android socket编程——两个模拟器间的通信(一台PC)
- android socket编程 同一台pc 实现两个android终端的通信
- android socket编程——两个模拟器间的通信(一台PC)
- android socket编程——两个模拟器间的通信(一台PC)
- 两台 PC 机之间的串口通信
- java socket 进行两台PC之间的文件传输
- 一个异步Socket通信的例子(Windows)
- 保证一个程序在同一台PC中只运行一个实例的两种方法
- socket通信:连接到server并发送一个love消息给server
- error:val()显示不了某个属性的内容
- nginx apache限制ip并发访问 限制ip连接
- android 长度单位 dp dip sp px pt
- EditView怎么去掉下边那个输入用的横线
- 超酷随身碟在超酷价格
- 两台pc机用一个socket通信,每个pc机创建两个线程一个发消息一个收消息 windows socket
- 超薄手机诺基亚5310红色
- 赌场游戏。如何专业酒杯开始
- android 优秀开源项目
- 费城老鹰队门票老鹰登陆了六号种子为NFC淘汰赛
- c++中的虚函数
- 颤抖着在Windows Phone的市场
- 字符集编码的自动识别jchardet
- 非接触式NFC读卡器和作家从中国RFID