管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
) ^# k' |$ j R我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。5 |3 b. M9 r1 l% A' M
Talk is cheak , show me the code.$ p! @# f; s; [! q) d' w) d
服务端代码:1 z, z* G# J0 ?5 m7 x
- #include<stdlib.h>
7 ]/ E/ q+ x/ O- W: o [1 `9 Q - #include<WinSock2.h>
$ N3 I ?2 Z( l - #pragma comment(lib,"ws2_32.lib")
H: t* b/ m( f M - int main(){9 \9 Z8 W( X- q+ |+ J- K
- WSADATA wsd;8 u1 [2 o' b& i; V7 Z4 C, f
- SOCKET sockServer;3 E4 \) d# W: u6 x( o2 ]
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
, b. l% ~) n- J" F1 ^+ n: z - SOCKET sockClient;
' T Z' Q+ p7 j/ q1 p- k - SOCKADDR_IN clientaddr;5 @ t; T4 l; ~) |% y
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ e& {9 l' S2 q
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: q6 _ |% X1 }$ H5 c! y6 W! S
- 4 _. l0 c( O/ R; n k3 R
" e* v9 u5 q0 s- if (sockServer != -1 && sockServer != INVALID_SOCKET){
2 i9 e/ p* ]/ Z- y) j - printf("Socket has been created :%d", sockServer);% N* ]) X* `5 B- U3 s1 N
- }" Y" I! ~" i- \% x0 n; _
- else{
5 t8 D) B7 k8 c& j - printf("Socket create failed.");0 H! G9 {1 s% |* ]9 K3 g! K. i- Z' t5 z
- exit(0);" {: x. ]" a3 @2 V z( k
- }3 L7 Y! B4 D' n1 G' @0 Z
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
" X! l2 A' _# [( m% N% H2 U3 p; ^ - serveraddr.sin_family = AF_INET;) r2 m. o5 L0 T( j& b
- serveraddr.sin_port = htons(6000);//绑定端口60004 z' S( m0 B2 g* P! t
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
+ Q F. v! D6 h# k' { - char recvBuf[100];
, ~3 r5 L3 }; K - int len = sizeof(SOCKADDR);1 |) M$ E2 t0 u& Y" X" M5 ?
- listen(sockServer, 5);//5为等待连接数+ S% l) F0 z+ s& d: b% H1 N
- while (1){+ E/ s6 N- `# |( y! _0 `
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);9 _+ ^' i, |' V% U
- //接收客户端数据
7 h1 c; B! [3 C" r: n - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);; D# @7 b6 ~* K) y3 s2 c- `
- printf("to me:%s\n",recvBuf);- e, F+ P7 R+ @' [5 l) x' F O
- memset(recvBuf, 0, 100);/ b, i) d1 V4 n; V+ c
- }
+ e" S- q w( D- T; I: g - closesocket(sockClient);
2 j( x% d E2 w* `) h - system("pause");3 S1 s+ x5 g3 A& ~5 F
- return 0;$ S( C4 U9 F& d/ Q
- }
复制代码 客户端代码:
# Y5 w0 f1 S7 z7 H; w- #include<winsock2.h>4 [/ g$ E& v+ z+ L2 ]6 ]9 n
- #include<stdio.h>: }. j: c+ L- B8 x7 h4 D! G
- #pragma comment(lib, "ws2_32.lib")
! ]: h1 L8 o& k' E. T, c - void main()* `; D2 D9 z! `, Y8 p3 {
- {/ r1 p+ Z6 R" F; S5 }; A' g
- WSADATA wsaData;, W: c, M9 p! k& ` {$ G: s# k7 R, K
- SOCKET sockClient;//客户端Socket7 J' r3 W7 l+ U* ?
- SOCKADDR_IN addrServer;//服务端地址* A3 r5 }8 e/ a, j9 x
- WSAStartup(MAKEWORD(2, 2), &wsaData);
5 z" U. P7 x a' g - char message[20] = "HelloSocket!";
& I: W, n: u1 G! W - //定义要连接的服务端地址: ~) i* h9 i5 H3 I# F+ C
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
! t) E1 K4 ]) W& l9 V4 _ - addrServer.sin_family = AF_INET;: S: @5 P" i3 J1 U2 R9 K
- addrServer.sin_port = htons(6000);//连接端口6000! S; I$ q- x/ B* T2 N9 {
- //新建客户端socket$ B3 a) g2 y0 Q
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; E; A7 L9 l1 l0 }2 ^- Y' y% w( k2 m
- int s = 0;9 M1 i1 Y* V( G; \. ^4 w( Y- T9 |/ y
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
$ Q, h) d, g% M0 b7 [; p. _: \6 d
, A! l/ Y' j/ d! W6 ^4 G- while (1){
4 S& R% l. T5 s8 @3 B. x7 _ - //发送数据+ h# L$ v" Z1 F2 h( J/ q; R5 J. S
- int a = send(sockClient, message, strlen(message) + 1, 0);2 B0 o8 q: C! p) q
- printf("to server:");! c- Q7 e3 y% j
- scanf("%s", message);- H: Z& D' m9 X
- ) ?! t+ }- _0 {9 G
- }
' X3 V; j% W+ l3 b* E# q - //关闭socket
; v9 b/ b7 Y; [8 e7 J3 ^ - closesocket(sockClient);
[9 l: K* p& `) A - WSACleanup();
# ` Q, F8 l7 l5 c. d - }
复制代码 求懂的高手来解答一下。
1 W/ n6 v8 W6 J; P; Q$ B谢谢了!) e+ o" O7 m2 ^4 `; [* r
+ H5 k+ A$ H8 D2 Z( m K' ~$ g
7 m* \+ m, q& y: `, k U7 A
g' v' y2 B x1 y4 N; T! k
|
|