程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
客户端程序:client.cpp
- #include <winsock2.h>
- #include <stdio.h>
- #include <stdlib.h>
- #define DEFAULT_PORT 5150
- #define DEFAULT_BUFFER 2048
- char szServer[128],
- szMessage[1024];
- int iPort = DEFAULT_PORT;
- int main()
- {
- WSADATA wsd;
- SOCKET sClient;
- char szBuffer[DEFAULT_BUFFER];
- int ret;
- struct sockaddr_in server;
- struct hostent *host = NULL;
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
- {
- printf("Failed to load Winsock library!\\n");
- return 1;
- }
- printf("Enter a string to send to server:\\n");
- gets(szMessage);
- // Create the socket, and attempt to connect to the server
- sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sClient == INVALID_SOCKET)
- {
- printf("socket() failed: %d\\n", WSAGetLastError());
- return 1;
- }
- server.sin_family = AF_INET;
- server.sin_port = htons(iPort);
- server.sin_addr.s_addr = inet_addr("127.0.0.1");
- if (connect(sClient, (struct sockaddr *)&server,
- sizeof(server)) == SOCKET_ERROR)
- {
- printf("connect() failed: %d\\n", WSAGetLastError());
- return 1;
- }
- // Send and receive data
- ret = send(sClient, szMessage, strlen(szMessage), 0);
- if (ret == SOCKET_ERROR)
- {
- printf("send() failed: %d\\n", WSAGetLastError());
- }
- else{
- printf("Send '%s' \\n", szMessage);
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
- if (ret == SOCKET_ERROR){
- printf("recv() failed: %d\\n", WSAGetLastError());
- }
- else{
- szBuffer[ret] = '\\0';
- printf("RECV: '%s'\\n",szBuffer);
- }
- }
- closesocket(sClient);
- WSACleanup();
- return 0;
- }
- #include <winsock2.h>
- #include <stdio.h>
- #include <stdlib.h>
- #define DEFAULT_PORT 5150
- #define DEFAULT_BUFFER 4096
- int iPort = DEFAULT_PORT;
- char szAddress[128];
- DWORD WINAPI ClientThread(LPVOID lpParam)
- {
- SOCKET sock=(SOCKET)lpParam;
- char szBuff[DEFAULT_BUFFER];
- int ret;
- while(1)
- {
- ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
- if (ret == 0)
- break;
- else if (ret == SOCKET_ERROR)
- {
- printf("recv() failed: %d\\n", WSAGetLastError());
- break;
- }
- szBuff[ret] = '\\0';
- printf("RECV: '%s'\\n", szBuff);
- if(strcmp(szBuff,"abc")==0){
- memcpy(szBuff,"Send the correct string!",25);
- }
- else{
- memcpy(szBuff,"Send the wrong string!",23);
- }
- ret = send(sock, szBuff, strlen(szBuff), 0);
- if (ret == SOCKET_ERROR){
- printf("send() failed: %d\\n", WSAGetLastError());
- }
- }
- return 0;
- }
- int main()
- {
- WSADATA wsd;
- SOCKET sListen,
- sClient;
- int iAddrSize;
- HANDLE hThread;
- DWORD dwThreadId;
- struct sockaddr_in local,
- client;
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
- {
- printf("Failed to load Winsock!\\n");
- return 1;
- }
- // Create our listening socket
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
- if (sListen == SOCKET_ERROR)
- {
- printf("socket() failed: %d\\n", WSAGetLastError());
- return 1;
- }
- local.sin_addr.s_addr = htonl(INADDR_ANY);
- local.sin_family = AF_INET;
- local.sin_port = htons(iPort);
- if (bind(sListen, (struct sockaddr *)&local,
- sizeof(local)) == SOCKET_ERROR)
- {
- printf("bind() failed: %d\\n", WSAGetLastError());
- return 1;
- }
- listen(sListen, 8);
- // In a continous loop, wait for incoming clients. Once one
- // is detected, create a thread and pass the handle off to it.
- while (1)
- {
- iAddrSize = sizeof(client);
- sClient = accept(sListen, (struct sockaddr *)&client,
- &iAddrSize);
- if (sClient == INVALID_SOCKET)
- {
- printf("accept() failed: %d\\n", WSAGetLastError());
- break;
- }
- printf("Accepted client: %s:%d\\n",
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));
- hThread = CreateThread(NULL, 0, ClientThread,
- (LPVOID)sClient, 0, &dwThreadId);
- if (hThread == NULL)
- {
- printf("CreateThread() failed: %d\\n", GetLastError());
- break;
- }
- CloseHandle(hThread);
- }
- closesocket(sListen);
- WSACleanup();
- return 0;
- }
|