// tcpsocketserver.cpp
#include #include #include #pragma comment(lib,"ws2_32.lib")
#define ip_address "127.0.0.1"
#define port 5678
static dword winapi recvthread(void *param);
static dword winapi sendthread(void *param);
void main()
if (lobyte(wsadata.wversion) != 2 || hibyte(wsadata.wversion) != 2)
socketserver = socket(af_inet, sock_stream, 0);//建立套接字
if (socketserver == invalid_socket)
= htonl(inaddr_any);
addrsrv.sin_addr.s_un.s_addr = inet_addr(ip_address);
addrsrv.sin_family = af_inet;//將sin_family欄位設定為af_inet,代表winsock使用的是ip位址族
addrsrv.sin_port = htons(port);//埠號
retcode = bind(socketserver, (sockaddr*)&addrsrv, sizeof(sockaddr));//繫結套接字到乙個ip位址和乙個埠上
if (retcode == socket_error)
retcode = listen(socketserver, 2);//將套接字設定為監聽模式等待連線請求
if (retcode == socket_error)
printf("tcp server is running....\n");
while (1)
printf("接受到乙個連線:%s \r\n", inet_ntoa(addrclient.sin_addr));
clientsocketset.push_back(socketconnection);
//建立乙個子執行緒呼叫recvthread函式,專門用來接收訊息
handle recvthreadhandle = createthread(null, 0, recvthread, &socketconnection, 0, null);
if (recvthreadhandle == null)
threadhandleset.push_back(recvthreadhandle);
handle sendthreadhandle = createthread(null, 0, sendthread, &socketconnection, 0, null);
if (sendthreadhandle == null)
threadhandleset.push_back(sendthreadhandle);
} fprintf(stderr, "main thread to wait sub thread to finish.\n");
for (int i = 0; i < threadhandleset.size(); i++) }
for (int i = 0; i < clientsocketset.size(); i++)
closesocket(socketserver);
wsacleanup();//關閉載入的套接字型檔
}static dword winapi recvthread(void *param)
else if (ret == 0 || (ret == socket_error && wsagetlasterror() == wsaeconnreset))
else if (ret == socket_error && wsagetlasterror() == wsaewouldblock)
}fprintf(stderr, "接收資料子執行緒退出\n");
return 0;
}static dword winapi sendthread(void *param)
retcode = send(socketconnection, sendbuf, length, 0);
if (retcode == socket_error && wsagetlasterror() == wsaeconnreset)
else if (retcode == socket_error)
if (retcode != socket_error)
}fprintf(stderr, "傳送資料子執行緒退出\n");
return 0;
}// tcpsocketclient.cpp
#include #include #pragma comment(lib,"ws2_32.lib")
#define ip_address "127.0.0.1"
#define port 5678
static dword winapi recvthread(void *param);
void main( )
if (lobyte(wsadata.wversion) != 2 || hibyte(wsadata.wversion) != 2)
socketclient = socket(af_inet, sock_stream, 0);
if (socketclient == invalid_socket)
addrsrv.sin_addr.s_un.s_addr = inet_addr(ip_address);//ip位址
addrsrv.sin_family = af_inet; //將sin_family欄位設定為af_inet,代表winsock使用的是ip位址族
addrsrv.sin_port = htons(port); //埠號
//向伺服器端發出連線請求
retcode = connect(socketclient, (sockaddr*)&addrsrv, sizeof(sockaddr));
if (retcode == socket_error)
//建立子執行緒呼叫recvthread函式,專門用來接收伺服器端發過來的訊息
handle recvdatathreadhandle = createthread(null, 0, recvthread, &socketclient, 0, null);
if (recvdatathreadhandle == null)
fprintf(stderr, "create recive data thread failed!\n");
//傳送訊息在主線程當中實現
while (1)
retcode = send(socketclient, sendbuf, strlen(sendbuf) + 1, 0);//傳送訊息
if (retcode == socket_error && wsagetlasterror() == wsaeconnreset)
else if (retcode == socket_error)
if (retcode != socket_error)
}if (recvdatathreadhandle)
closesocket(socketclient);
wsacleanup();//關閉載入的套接字型檔
}static dword winapi recvthread(void *param)
else if (ret == 0 || (ret == socket_error && wsagetlasterror() == wsaeconnreset))
else if (ret == socket_error && wsagetlasterror() == wsaewouldblock)
}return 0;
}
Windows Socket 程式設計
伺服器端 客戶端 在 http fayaa.com code 處理的高亮顯示效果 c 語言 臨時自用 include include void main if lobyte wsadata wversion 1 hibyte wsadata wversion 1 socket socksrv soc...
Windows Socket程式設計
windows下socket程式設計主要包括以下幾部分 服務端1 初始化windows socket庫。2 建立socket。3 繫結socket。4 監聽。5 accept。6 接收 傳送資料。客戶端1 初始化windows socket庫。2 建立socket。3 連線socket。4 接收 傳...
Windows Socket程式設計
1 初始化windows socket庫。2 建立socket。3 繫結socket。4 監聽。5 accept。6 接收 傳送資料。1 初始化windows socket庫。2 建立socket。3 連線socket。4 接收 傳送資料。服務端每接收到乙個客戶端的socket,則建立乙個執行緒。滿...