socket多线程问题 编写两个windows程序,每个程序都既有客户端又有服务端,采用winsock模式相互通信。我知道实现这样的程序需要至少两个线程,即一个线程实现客户端功能,一个线程实现服务端功能。我是网络编程的菜鸟~~请问各位高手,能否给出编写的流程(有实例参考代码就最好了),谢谢~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己到网上找相关的demo或者找本书看看吧. 你看看,行不行。#include <winsock.h>#include <stdio.h>#define PORT 5150#define MSGSIZE 1024#pragma comment(lib, "ws2_32.lib")int g_iTotalConn = 0;SOCKET g_CliSocketArr[FD_SETSIZE];DWORD WINAPI WorkerThread(LPVOID lpParameter);int main(){ WSADATA wsaData; SOCKET sListen, sClient; SOCKADDR_IN local, client; int iaddrSize = sizeof(SOCKADDR_IN); DWORD dwThreadId; // Initialize Windows socket library WSAStartup(0x0202, &wsaData); // Create listening socket sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Bind local.sin_addr.S_un.S_addr = htonl(INADDR_ANY); local.sin_family = AF_INET; local.sin_port = htons(PORT); bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN)); // Listen listen(sListen, 3); // Create worker thread CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId); while (TRUE) { // Accept a connection sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize); printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); // Add socket to g_CliSocketArr g_CliSocketArr[g_iTotalConn++] = sClient; } return 0;}DWORD WINAPI WorkerThread(LPVOID lpParam){ int i; fd_set fdread; int ret; struct timeval tv = {1, 0};//秒,毫秒 char szMessage[MSGSIZE]; memset(szMessage,0,MSGSIZE); while (TRUE) { FD_ZERO(&fdread); for (i = 0; i < g_iTotalConn; i++) { FD_SET(g_CliSocketArr[i], &fdread); } // We only care read event ret = select(0, &fdread, NULL, NULL, &tv); if (ret == 0) //Wait time out. { printf("time out\n"); continue; } for (i = 0; i < g_iTotalConn; i++) { if (FD_ISSET(g_CliSocketArr[i], &fdread)) { // A read event happened on g_CliSocketArr[i] ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0); if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)) { // Client socket closed printf("Client socket %d closed.\n", g_CliSocketArr[i]); closesocket(g_CliSocketArr[i]); if (i < g_iTotalConn - 1) { g_CliSocketArr[i--] = g_CliSocketArr[--g_iTotalConn]; } } else { // We received a message from client char* pMsg = new char[ret - 5]; memcpy(pMsg,szMessage+5,ret - 5); printf("%s\n",pMsg); delete[] pMsg; send(g_CliSocketArr[i], szMessage, ret, 0); } } } } return 0;} 对了,发送的细节你改一下。 // We received a message from client char* pMsg = new char[ret - 5]; memcpy(pMsg,szMessage+5,ret - 5); printf("%s\n",pMsg); delete[] pMsg; send(g_CliSocketArr[i], szMessage, ret, 0);改为:send(g_CliSocketArr[i],szMessage.ret,0); DWORD WINAPI WorkerThread(LPVOID lpParam)这个函数里的东西是不是就是实现了客户端的功能?我不明白的是,怎么没有看到connect()呢? DrawFrameControl画checkbox丢失主题风格 关于GDI+的画笔问题,高手入进来看下 OpenGL中如何选择摄像机的镜头类型? 通过HTTP的POST方式,如何上传文件到服务器? C++静态数据成员感悟 看一下,执行这个函数后,怎么总是出现内存不能读写的错误?? vc++ 检查内存泄露机制 进来看看吧,一个奇怪的 ASSERT() 错误 谁可以写一个在一个框架内的两个view里画直线和圆的程序, 只能给20分了! 呵呵 高分求解(心急!!!) 这样的多线程socket程序可行不? 程序之间的访问问题
#include <winsock.h>
#include <stdio.h>#define PORT 5150
#define MSGSIZE 1024#pragma comment(lib, "ws2_32.lib")int g_iTotalConn = 0;
SOCKET g_CliSocketArr[FD_SETSIZE];DWORD WINAPI WorkerThread(LPVOID lpParameter);int main()
{
WSADATA wsaData;
SOCKET sListen, sClient;
SOCKADDR_IN local, client;
int iaddrSize = sizeof(SOCKADDR_IN);
DWORD dwThreadId;
// Initialize Windows socket library
WSAStartup(0x0202, &wsaData);
// Create listening socket
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// Bind
local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(PORT);
bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));
// Listen
listen(sListen, 3);
// Create worker thread
CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId);
while (TRUE)
{
// Accept a connection
sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);
printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
// Add socket to g_CliSocketArr
g_CliSocketArr[g_iTotalConn++] = sClient;
}
return 0;
}DWORD WINAPI WorkerThread(LPVOID lpParam)
{
int i;
fd_set fdread;
int ret;
struct timeval tv = {1, 0};//秒,毫秒
char szMessage[MSGSIZE];
memset(szMessage,0,MSGSIZE);
while (TRUE)
{
FD_ZERO(&fdread);
for (i = 0; i < g_iTotalConn; i++)
{
FD_SET(g_CliSocketArr[i], &fdread);
}
// We only care read event
ret = select(0, &fdread, NULL, NULL, &tv);
if (ret == 0) //Wait time out.
{
printf("time out\n");
continue;
}
for (i = 0; i < g_iTotalConn; i++)
{
if (FD_ISSET(g_CliSocketArr[i], &fdread))
{
// A read event happened on g_CliSocketArr[i]
ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0);
if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))
{
// Client socket closed
printf("Client socket %d closed.\n", g_CliSocketArr[i]);
closesocket(g_CliSocketArr[i]);
if (i < g_iTotalConn - 1)
{
g_CliSocketArr[i--] = g_CliSocketArr[--g_iTotalConn];
}
}
else
{
// We received a message from client
char* pMsg = new char[ret - 5];
memcpy(pMsg,szMessage+5,ret - 5);
printf("%s\n",pMsg);
delete[] pMsg;
send(g_CliSocketArr[i], szMessage, ret, 0);
}
}
}
}
return 0;
}
// We received a message from client
char* pMsg = new char[ret - 5];
memcpy(pMsg,szMessage+5,ret - 5);
printf("%s\n",pMsg);
delete[] pMsg;
send(g_CliSocketArr[i], szMessage, ret, 0);
改为:send(g_CliSocketArr[i],szMessage.ret,0);
我不明白的是,怎么没有看到connect()呢?