《基于socket简易聊天程序》由会员分享,可在线阅读,更多相关《基于socket简易聊天程序(9页珍藏版)》请在金锄头文库上搜索。
1、简朴的sockt程序-0113 2:1虽然很简朴,但还是调试了很长时间。本科时候接触过skt那个帅帅的刘教师的课,目前重新再拾起来。程序中专门建立一种FunThr线程用来接受数据,实现双向通信,也可以持续发送、持续接受。代码贴上来,如果还能保存VView那样的颜色区别就好看了,但是试了好几遍都不行sere:#nclude inud die PORT 000 /服务器端口fine MIE 12 /收发缓冲区的大小#praga coment(li, w2_3.lib) /链接静态库DWORD WIAP unThad(LPOD); /创立一种线程,专门用来接受数据SCT sClent; /连接所用套
2、节字SOCET sListn; /监听套接字SOKDRIN clnt; /保存客户的地址信息tiadrize= sieof(SODDR_I);intmi()WDAT wsDa;SOADDRIN local;chas_MssMSIZE; /收发缓冲区taup(0x0202, &wsaData);/Iitize inw soket lbraryListe = sockt(AF_IET, SOCK_STREA, PROTO_T);/创立服务器监听套节字。TCP合同loca.sin_fai =AF_INET; /AFINE指明使用P/IP合同族loal.sin_pot = tons(PORT);/指明
3、连接服务器的端标语calsin_addr._add = hol(ADDR_AN);/自动获取本机地址bind(sistn, (struct sokaddr *)&lol, izeo(SOCKDDR_IN));/地址绑定到套接字sten(sLstn, 1);/开始监听Clint =accept(Listen,(strt sockar*)&lent, &iaddrSie);/建立连接rintf(Accpe client:%:%dn, ne_noa(ien.s_addr), nths(liesn_pot);HANDLE hTrrteThrad(NULL,Fuhead,0,0,);/创立接受线程Clo
4、seHandle(Thread);whle (TRUE) printf(ServSen:); /从键盘输入 gts(ese); /发送数据sed(Client, _ae, srlen(sesae), ); eturn0; DOR WINAPIFunThred(PVOD) ca cMessageMSGSIZ; /收发缓冲区ine; 接受字节的个数whil (TRE) ret = rcv(sClient, c_Messag,MSGSZ, 0);/接受数据if(ret=SOCKET_ERROR) printf(c iclosed!); sCien=accpt(Liste, (struct sckdr
5、*)&cint, &iaddrSize);/重新开始监听 prntf(nAcpe newclient:%s:%d, netnto(clent.si_adr),tos(lent.sn_ort); eme(c_essa,0,124);/将本来的clietmessage归零 continue; _Mageret = 0; printf(nRceived: sn, c_Meg); reun 0; client:#inclue WI2.#incld #deie ERV_ADRESS 127.0.0.1 /服务器端I地址#define RT 600 #efinSZ 2#ragma comment(i, s
6、2_3.) DWRD WINPI Fned(LPOD); SOCKT sClint; SCDRINver;nt ain() WSAATA wsaDaa;har cMessageMSGSZE;SAStatp(002, &wDaa);sent = sockt(F_IET,SOCK_STREAM, PPROTO_TCP);emset(&sere, 0,sizeof(SKDDR_I)); /先将保存地址的rve置为全ever.sinamiy =F_IET; /声明地址格式是TCP/IP地址格式servr.sinport = hton(OR); /指明连接服务器的端标语server.sn_addr.s_
7、adr =inet_adr(SRVER_ADDRESS); /指明连接服务器的IP地址cnect(sClen, (sruc sckaddr*)serve, izeof(SOKADR_IN)); /连到刚刚指明的服务器上HAL hTredreateread(NUL,,FnThread,0,0);Closeal(Thead);while (TU) printf(lient ed:);gt(c_Message); snd(en, cMessae, strlen(c_Mssae), ); i(!tcp(c_Mesag,eit)/clt自身退出exit(1);/释放连接和进行结束工作cseock(sCl
8、int);WSCeanup();eurn 0;WOR INAI Fnred(LPVOID)cha s_essgeSGSIZE;in ret; whe(TUE) re =recv(sClient, _ssge, MSGSIZE,0); f(retSOCKE_EROR) printf(Sever s osed!);ext(1); _Messeet = 0;rinf(nReeived:%sn, s_Mesag); if(!tcp(s_ssge,xit))/eer让client退出 it(1);retur;程序在C+ 6.环境下编译通过。先运营sve端,再运营lient,链接建立:lt和servr可进行双通信,可持续发送、接受;clent可自行退出,也可由rr强制退出,发送exi命令即可:cent退出后,serr重新建立监听,有新的cien运营时,再次建立新的连接:注意:clnt的端标语是随机的。服务器关闭时,client自动退出: