3 回答

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
#include <winsock.h>
#include <stdio.h>
#define PORT 5150 //端口
#define MSGSIZE 1024 //信息大小
#pragma comment(lib, "ws2_32.lib")
int g_iTotalConn = 0; //連接數(shù)量
SOCKET g_CliSocketArr[FD_SETSIZE]; //套接字?jǐn)?shù)組
DWORD WINAPI WorkerThread(LPVOID lpParameter);//線程函數(shù)
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
//創(chuàng)建套接字
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
//監(jiān)聽
listen(sListen, 3);
// Create worker thread
//創(chuàng)建線程
CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId);
while (TRUE)
{
// Accept a connection
//接受一個(gè)連接,返回的是客戶套的套接字
sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);
//這里client的SOCKADDR_IN client 中可以取出IP
printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
// Add socket to g_CliSocketArr
//把客戶端套接字放入數(shù)組中
g_CliSocketArr[g_iTotalConn++] = sClient;
}
return 0;
}
DWORD WINAPI WorkerThread(LPVOID lpParam)//線程
{
int i;
fd_set fdread;//結(jié)構(gòu)
int ret;
struct timeval tv = {1, 0};//超時(shí)時(shí)間 SELECT模型中用到的這里是1秒
char szMessage[MSGSIZE];//信息數(shù)組,事實(shí)上就是個(gè)緩沖區(qū)
while (TRUE)
{
FD_ZERO(&fdread);//清空fd_set結(jié)構(gòu)
for (i = 0; i < g_iTotalConn; i++)
{
FD_SET(g_CliSocketArr[i], &fdread);//把客戶套接字放到SELECT要求的數(shù)組中
}
//**************************************
// We only care read event
//只關(guān)心讀的情況
ret = select(0, &fdread, NULL, NULL, &tv);
if (ret == 0)
{
// Time expired 超時(shí)
continue;
}
//如果SELECT返回不是0
for (i = 0; i < g_iTotalConn; i++)
{
if (FD_ISSET(g_CliSocketArr[i], &fdread))
{
// A read event happened on g_CliSocketArr[i]
//一個(gè)可讀發(fā)生在這個(gè)套接字上
ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0);
//把它讀出到緩沖區(qū)
if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))
{
// Client socket closed
//客戶端關(guān)閉
printf("Client socket %d closed.\n", g_CliSocketArr[i]);
closesocket(g_CliSocketArr[i]);//關(guān)閉這個(gè)套接字
if (i < g_iTotalConn - 1)
{
//將數(shù)組中最后一個(gè)套接字挪到當(dāng)前的位置上
g_CliSocketArr[i--] = g_CliSocketArr[--g_iTotalConn];
}
}
else
{
// We received a message from client
//如果以上沒發(fā)生,那么就接收到一個(gè)客戶端的信息
szMessage[ret] = '\0';
//直接回送回去
send(g_CliSocketArr[i], szMessage, strlen(szMessage), 0);
}
}
}
}
return 0;
}
1 |

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
怎么在VS2005里面調(diào)試socket函數(shù)
一個(gè)VS2005 無法調(diào)試C++的問題
現(xiàn)象:在vs2005 中,建立一個(gè)空項(xiàng)目,添加一個(gè)c++文件main.cpp
#include iostream
using namespace std;int main(){cout hello ;}此時(shí)按f5 啟動(dòng)調(diào)試,即會(huì)提示項(xiàng)目無法調(diào)試:無法找到“xxx.exe”的調(diào)試信息,或者調(diào)試
信息不匹配。未使用調(diào)試信息生成二進(jìn)制文件。
搜了一些資料,都說建立項(xiàng)目的時(shí)候不應(yīng)建立空項(xiàng)目,而應(yīng)當(dāng)建立一個(gè)console application。
人寫到。 其實(shí)問題在于,在空項(xiàng)目中不生成調(diào)試文件pdb,所以無法調(diào)試。
要讓項(xiàng)目生成pdb 文件,需要更改:
項(xiàng)目屬性,configuration properties- linker- Generate Debug Info 從 no 改為 yes
但這樣還是不夠的,還需要更改:
- 3 回答
- 0 關(guān)注
- 608 瀏覽
添加回答
舉報(bào)