管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。( q% k. |+ X* t3 F/ R! s
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
! q8 p$ ]9 A- u- LTalk is cheak , show me the code." S% q: d E8 b- M" G9 t
服务端代码:
; P7 `$ n# ~& k, T" T, s- #include<stdlib.h>
6 M4 f& U$ w* L' s$ J' T* \ - #include<WinSock2.h>3 h7 h# g* \' F! u$ ^2 X
- #pragma comment(lib,"ws2_32.lib")
+ i; D, s: }% ^" W- H4 N+ r4 N - int main(){
3 e. k" h& z; @2 y0 J4 d - WSADATA wsd;* Q' y, O6 Q) R D8 L
- SOCKET sockServer;
9 t8 \! G" O# f8 i& g; X - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号+ ]8 y) w! H7 ? ~ w3 t
- SOCKET sockClient;
7 H8 ?! x* `" U* ] - SOCKADDR_IN clientaddr;
6 W/ e3 ?( z, e$ Z - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口1 C% Y: U6 m) I
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
' c5 i$ z. B( b/ x' R' ?
R& ^. A2 P6 I6 `0 v" _* p3 ]- ! t# o* C5 ]' x. U6 C/ M
- if (sockServer != -1 && sockServer != INVALID_SOCKET){5 ^7 K D+ C6 {% o9 _
- printf("Socket has been created :%d", sockServer);. f) `7 R5 z; e7 I7 ?1 I
- }( w2 U* s) W3 N+ W# }: e
- else{" o; O% A- F2 x5 T( v6 }
- printf("Socket create failed.");
9 I% q7 h# r" _0 E: {- w( ]1 d1 o - exit(0);
% {; \& c* |1 r& C, a: p& c - }$ |, U' A* N! t0 ~. ?
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);. O* j3 @& Q* `( z" u- F& U
- serveraddr.sin_family = AF_INET;2 n9 }6 k- W) {6 t
- serveraddr.sin_port = htons(6000);//绑定端口6000* Q. E( W% I1 D6 z' U
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
# I, a ^8 m$ n0 f& k1 ^8 ^5 W* h. r - char recvBuf[100];
# C2 s- H% ^4 n5 R ^$ E* o - int len = sizeof(SOCKADDR);
% m- ^+ r0 {( \; v - listen(sockServer, 5);//5为等待连接数/ |1 P* u7 h' M F* T0 ]
- while (1){
. ?- W: N% o5 g; o/ _* W - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len); g5 P: C! G H& t! r
- //接收客户端数据* [. V7 [! n0 o) r1 F
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);# c; R( v1 N' L( h: q( d4 I& s( d
- printf("to me:%s\n",recvBuf);
, h% O2 D# T% p8 ?. H - memset(recvBuf, 0, 100);4 Z2 I7 Y9 D( n j9 t
- }
5 G$ D9 S: K. E* W- h - closesocket(sockClient);
( J( B. V9 y: H9 p4 k6 E - system("pause");2 j5 j2 u, W. Q+ m0 S! Y. \" q
- return 0;
% E: `2 [6 k0 f6 k - }
复制代码 客户端代码:
3 }( Y' D# `3 S: H1 H' d3 y. v- #include<winsock2.h>
# _' B A0 J6 J6 A Y* V - #include<stdio.h>
' a# k0 D% P, ?' T* c- V3 g - #pragma comment(lib, "ws2_32.lib")9 r! P. }$ w2 z
- void main(); d$ W+ w2 i! N- r/ {0 a
- {$ m. T: e/ _! x* C7 ^) @( S2 g1 U
- WSADATA wsaData;" V& g% y7 D9 t+ k
- SOCKET sockClient;//客户端Socket( M& J! X3 W) Q/ `& W' r. d
- SOCKADDR_IN addrServer;//服务端地址9 W) H3 t) m; m
- WSAStartup(MAKEWORD(2, 2), &wsaData);
0 G" T3 B2 C: b8 B2 i - char message[20] = "HelloSocket!";
9 x: l4 P5 x% U/ I4 r% s - //定义要连接的服务端地址
- h7 [* z+ m: @" o$ ~! U& u6 d - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
: o, [1 ^/ @6 e) y5 n - addrServer.sin_family = AF_INET;! P+ N. F6 g* s; a6 n, }
- addrServer.sin_port = htons(6000);//连接端口6000
, Q8 v# O; n6 w6 V; m - //新建客户端socket
1 b: c7 E3 o E$ R2 @ - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( g& m- J$ F) ?) {4 j: C0 C1 H
- int s = 0;0 { |' k6 m' A; ]$ i6 j# [
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));1 b5 e0 ?. ~* G
- 8 F! _: N6 E2 p
- while (1){. W# C* I. V. ?" C$ y
- //发送数据0 `7 \2 N1 N- c8 t& d- R
- int a = send(sockClient, message, strlen(message) + 1, 0);
2 c! L, L2 w+ B - printf("to server:");: `: O+ x& w, L/ v& Z+ y
- scanf("%s", message);
: f4 G# O- I8 _9 p& n
4 c" I( K+ x) J- }
4 M/ A" V7 j3 y - //关闭socket3 [: i+ X' y. |8 Y& ]% t
- closesocket(sockClient);9 v/ s7 J. U# r9 w% R
- WSACleanup();
% B9 ?+ K+ Q8 u' m6 ?! w+ ^; G4 K - }
复制代码 求懂的高手来解答一下。
/ g, o# m! |) e谢谢了!4 S+ ~* i! g; o! j8 l& V
3 \0 ^4 n: c: j$ r& N6 B& y$ f: G
' G* q, v& C+ g2 _+ E0 Q
7 D) _5 K' Q; |: ]/ s |
|