1. 程式人生 > 實用技巧 >網路程式設計(一)

網路程式設計(一)

#ifdef WIN32
#include<windows.h>
#else
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#define closesocket close;
#endif 
#include<stdio.h>
#include<thread>
class Tcp
{
public
: void Main() { char buf[1024] = { 0 }; for (;;) { int recvlen = recv(client, buf, sizeof(buf) - 1, 0); if (recvlen<0) { break; } buf[recvlen] = '\0'; if (strstr(buf, "quit") != NULL) {
char ce[] = "quit success!\n"; send(client, ce, strlen(ce) + 1, 0); break; } int sendlen = send(client, "ok\n", 4, 0); printf("%s", buf); } closesocket(client); delete this; } int client = 0; }; int main(int
argc, char *argv[]) { #ifdef WIN32 WSADATA ws; WSAStartup(MAKEWORD(2, 2), &ws); #endif int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { printf("建立socket失敗!\n"); return -1; } printf("建立成功,socket=[%d]\n", sock); unsigned short port = 8080; if (argc > 1) { port = atoi(argv[1]); } sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(port); #ifdef WIN32 server.sin_addr.S_un.S_addr = htonl(0); #else server.sin_addr.s_addr = htonl(0); #endif if (bind(sock, (sockaddr*)&server, sizeof(server)) != 0) { printf("繫結失敗!\n"); return -2; } printf("繫結埠號成功,埠號為:[%d]\n", port); listen(sock, 10); for (;;) { sockaddr_in client_sock; socklen_t len = sizeof(client_sock); int client = accept(sock, (sockaddr*)&client_sock, &len); if (client <= 0)break; printf("accept sock=%d\n", client); char *str = inet_ntoa(client_sock.sin_addr); unsigned short client_port = ntohs(client_sock.sin_port); printf("ip:%s port=%d\n", str, client_port); Tcp* p = new Tcp(); p->client = client; std::thread th(&Tcp::Main,p); th.detach(); } closesocket(sock); while (1); return 0; }

效果: