自己做了一個C++Http服務器,處理http的get請求。
客戶端是C#做的。現在的情況是C#發起一個請求,C++中都能accept到兩個連接。這是為什么呢?有懂C++和C#和網路編程的嗎
http服務端代碼
do
{
//初始化WSA
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
cResult.iResult = WSAStartup(sockVersion, &wsaData);
if (cResult.iResult)
{
cResult.strErr = "WSAStartup失敗";
break;
}
//創建套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (slisten == INVALID_SOCKET)
{
cResult.iResult = -1;
cResult.strErr = "創建套接字失敗";
break;
}
//系結IP和埠
sockaddr_in sin;
sin.sin_family = AF_INET;
int iPort = g_cfgManger.GetListenPort();
if (iPort < 0){
cResult.iResult = -1;
cResult.strErr = "埠號不合法";
break;
}
sin.sin_port = htons(iPort);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
cResult.iResult = -1;
cResult.strErr = "系結IP和埠失敗";
break;
}
//開始監聽
if (listen(slisten, 1) == SOCKET_ERROR)
{
cResult.iResult = -1;
cResult.strErr = "監聽出錯";
break;
}
//回圈接收資料
SOCKET sClient;
sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);
char revData[255];
int iCntText = 0;
while (true)
{
iCntText++;
printf("監聽中\n");
sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
if (sClient == INVALID_SOCKET)
{
//printf("accept error !");
printf("監聽到錯誤socket");
continue;
}
//printf("接受到一個連接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));//會報錯 error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings d:\linhs\專案\多執行緒接收檔案服務\myhttpserver\myhttpserver\myhttpserver.cpp 115 1 MyHttpserver
printf("接受第%d個連接:%s \r\n",iCntText, inet_ntoa(remoteAddr.sin_addr));
char acBuf[1024] = { 0 };
recv(sClient, acBuf, 1024, NULL);
DWORD dwThreadId;
newCnctThdParam * cnctParam = new newCnctThdParam;
cnctParam->OneSocket = sClient;
cnctParam->strRecvData = acBuf;
cnctParam->pClass = this;
CreateThread(NULL, NULL, NewConnectThread, cnctParam, NULL, &dwThreadId);
}
closesocket(slisten);
WSACleanup();
} while (0);
C#中的http請求代碼
string Url = "http://127.0.0.1/AskforTransport?fileSize=1111";
//string Url = "http://www.ltaaa.com/";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
request.KeepAlive = false;
HttpWebResponse response ;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
}
uj5u.com熱心網友回復:
多少個連接要看C#內部是怎么實作的,這其實與你服務端無關,它來請求什么你就回應什么就行了,先決議請求行,找出請求方法。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/96771.html
標籤:網絡編程
