一個超級簡單的tcp聊天程式
阿新 • • 發佈:2019-01-10
為了讓大家可以直接執行程式,並聊天,我直接用回測地址。
服務端:
#include <stdio.h> #include <winsock2.h> // winsock介面 #pragma comment(lib, "ws2_32.lib") // winsock實現 int main() { WORD wVersionRequested; // 雙位元組,winsock庫的版本 WSADATA wsaData; // winsock庫版本的相關資訊 wVersionRequested = MAKEWORD(1, 1); // 0x0101 即:257 // 載入winsock庫並確定winsock版本,系統會把資料填入wsaData中 WSAStartup( wVersionRequested, &wsaData ); // AF_INET 表示採用TCP/IP協議族 // SOCK_STREAM 表示採用TCP協議 // 0是通常的預設情況 unsigned int sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; // TCP/IP協議族 addrSrv.sin_addr.S_un.S_addr = INADDR_ANY; addrSrv.sin_port = htons(8888); // socket對應的埠 // 將socket繫結到某個IP和埠(IP標識主機,埠標識通訊程序) bind(sockSrv,(SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); // 將socket設定為監聽模式,5表示等待連線佇列的最大長度 listen(sockSrv, 5); SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); unsigned int sockConn = accept(sockSrv,(SOCKADDR*)&addrClient, &len); while(1) { char sendBuf[100] = {0}; scanf("%s", sendBuf); send(sockConn, sendBuf, strlen(sendBuf) + 1, 0); // 傳送資料到客戶端,最後一個引數一般設定為0 char recvBuf[100] = {0}; recv(sockConn, recvBuf, 100, 0); printf("%s\n", recvBuf); } closesocket(sockConn); closesocket(sockSrv); WSACleanup(); return 0; }
客戶端:
#include <winsock2.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") int main() { WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(1, 1); WSAStartup( wVersionRequested, &wsaData ); 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(8888); int ret = connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); while(1) { char recvBuf[100] = {0}; recv(sockClient, recvBuf, 100, 0); printf("%s\n", recvBuf); char sendBuf[100] = {0}; scanf("%s", sendBuf); send(sockClient, sendBuf, strlen(sendBuf) + 1, 0); } closesocket(sockClient); WSACleanup(); return 0; }
經測試, 程式 OK. (需要先在服務端按enter傳送)