天天看點

聊天室程式用戶端Linux下select函數實作的聊天伺服器

聊天室用戶端程式 Windows控制台應用程式

對應的Linux伺服器使用select模型實作:

Linux下select函數實作的聊天伺服器

http://blog.csdn.net/microtong/archive/2009/12/12/4989902.aspx

運作指令行為:Client.exe 127.0.0.1 8000

指令行參數分别為要連接配接的IP位址和端口

//Client.cpp

#include <winsock2.h>

#include <stdio.h>

#include <windows.h>

//引入靜态連結庫

#pragma comment(lib,"ws2_32.lib")

//緩沖區大小

#define BUFFER_SIZE 4096

//用來修改使用者姓名的指令

const char* CMD_NAME="name";

//用來退出系統的指令

const char* CMD_BYE="bye";

//負責接收資料的線程

DWORD WINAPI ReceiveThreadProc( LPVOID lpParameter);

int main(int argc, char* argv[]){

//判斷是否輸入了IP位址和端口号

if(argc!=3){

printf("Usage: %s IPAddress PortNumber/n",argv[0]);

exit(-1);

}

//把字元串的IP位址轉化為u_long

unsigned long ip;

if((ip=inet_addr(argv[1]))==INADDR_NONE){

printf("不合法的IP位址:%s",argv[1]);

exit(-1);

}

//把端口号轉化成整數

short port;

if((port = atoi(argv[2]))==0){

printf("端口号有誤!");

exit(-1);

}

printf("Connecting to %s:%d....../n",inet_ntoa(*(in_addr*)&ip),port);

WSADATA wsa;

//初始化套接字DLL

if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){

printf("套接字初始化失敗!");

exit(-1);

}

//建立套接字

SOCKET sock;

if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){

printf("建立套接字失敗!");

exit(-1);

}

struct sockaddr_in serverAddress;

memset(&serverAddress,0,sizeof(sockaddr_in));

serverAddress.sin_family=AF_INET;

serverAddress.sin_addr.S_un.S_addr = ip;

serverAddress.sin_port = htons(port);

//建立和伺服器的連接配接

if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){

printf("建立連接配接失敗!");

exit(-1);

}

//建立從伺服器接收資料的線程

DWORD threadId;

CreateThread(NULL,0,ReceiveThreadProc,&sock,0,&threadId);

printf(">");

char buf[BUFFER_SIZE];

while(1){

//從控制台讀取一行資料

gets(buf);

printf(">");

//發送給伺服器

if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR){

printf("發送資料失敗!");

exit(-1);

}

}

//清理套接字占用的資源

WSACleanup();

return 0;

}

DWORD WINAPI ReceiveThreadProc( LPVOID lpParameter){

SOCKET s = *(SOCKET*)lpParameter;

char receiveBuf[BUFFER_SIZE];

int bytes;

while(1){

if((bytes=recv(s,receiveBuf,sizeof(receiveBuf),0))==SOCKET_ERROR){

printf("接收資料失敗!/n");

exit(-1);

}

if(bytes==0){

printf("server is down./n");

exit(-1);

}

receiveBuf[bytes]='/0';

//如果使用者輸入了“bye”

if(strcmp(receiveBuf,CMD_BYE)==0){

closesocket(s);

exit(0);

}

printf("/n%s/n>",receiveBuf);

}

}

繼續閱讀