管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。" n. ]" A0 M/ {: I8 S2 H
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。/ D, B7 O0 k2 g9 d* P* m9 `$ R5 C* N' j
Talk is cheak , show me the code.6 P. m, f- B' V) S. l v
服务端代码:
: Q' o3 _) l; h+ X( A' C" i- #include<stdlib.h>. {5 c4 @( _& u6 \7 ? G2 L- l9 {$ d
- #include<WinSock2.h>
. R" F7 B. G# u( m - #pragma comment(lib,"ws2_32.lib")
+ `0 e5 p. |! x9 }6 l0 n - int main(){% Q+ l1 y$ k+ v
- WSADATA wsd;
8 ~6 m4 {0 T0 z. S9 q - SOCKET sockServer;5 k9 G4 ?$ A$ A( A
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
* d+ U# J2 s' g* R* c - SOCKET sockClient;
- B$ \' L! x) f3 Q5 o' L& l - SOCKADDR_IN clientaddr;
. Q- c. H8 S) h7 O0 y - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口/ i. e0 ~* U4 H- B: ?/ d: k
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
/ e- R. ^* n1 R: u7 S. R3 E8 e* M - # r: h) _- I0 V& }3 \! P
: v8 S" t, g) Y( m5 O- if (sockServer != -1 && sockServer != INVALID_SOCKET){
q: C/ D% l% }+ m - printf("Socket has been created :%d", sockServer);# ^5 \$ i" X3 w. O7 O' |6 c
- }+ d `/ `0 O& _( |+ A; ]
- else{
' [% A8 i {. k- z0 F" ]/ l - printf("Socket create failed.");
v, v5 \/ ^$ _& b% u - exit(0);
5 z: |. A, v# N* q9 C6 S8 @% c/ O - }
0 ?: O. w g" Y - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);. ?- q4 @( n4 E: K s" X6 T# l
- serveraddr.sin_family = AF_INET;# u/ W7 x% {, n% n
- serveraddr.sin_port = htons(6000);//绑定端口6000
) ^, T& }! Y5 l1 P - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));/ I' f/ b5 X# z. Q
- char recvBuf[100];
% `& v! t. Z4 U# D! a - int len = sizeof(SOCKADDR);) `4 M' f. C! @# d2 Z6 O, v1 M
- listen(sockServer, 5);//5为等待连接数1 }! p9 X) y& h' z
- while (1){
, ?$ t ~& M6 M5 Q - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
, s4 x4 P- g, N* | - //接收客户端数据! b5 k1 X% }; S% E0 i
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
- n% f' `) z" ?9 A% ~$ h1 ^4 t2 Q - printf("to me:%s\n",recvBuf);7 `- L O: _1 J- C, p
- memset(recvBuf, 0, 100);$ v( z9 J9 I; ]0 f
- }. E7 s1 T: w# A) z5 p8 {8 ~. c
- closesocket(sockClient);
: \ R8 C" Z! k$ O - system("pause");
& @9 I, ^" h% @9 L, ?" D - return 0;
4 t; G8 ^) F* r7 ~5 k2 I0 Y1 F - }
复制代码 客户端代码:, n' d* z4 j: C
- #include<winsock2.h>
7 z4 n* {# o0 v6 c- I$ k. o - #include<stdio.h>( `+ U- f) P. d8 q
- #pragma comment(lib, "ws2_32.lib")
, n+ H* K$ C) n" B/ g9 P - void main()4 q: E5 `8 \3 \. G/ J' t
- {
+ q7 J2 [/ I' V* G G7 N \- ?( b - WSADATA wsaData;( U1 L- J8 u( |7 f" N {5 G+ b1 v+ F
- SOCKET sockClient;//客户端Socket
, }1 T L5 ^: a - SOCKADDR_IN addrServer;//服务端地址2 u. e1 B) z6 F7 W' |
- WSAStartup(MAKEWORD(2, 2), &wsaData);
$ }+ T) C8 C Y- v5 y( w- J. I - char message[20] = "HelloSocket!";
8 t# L5 S* g# n6 {5 O5 L - //定义要连接的服务端地址
" b d, o) S( B* e3 } - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)# i; X! D% ]9 f& K
- addrServer.sin_family = AF_INET;
8 a$ O9 }& U! I/ m! G/ j; U - addrServer.sin_port = htons(6000);//连接端口6000
% P7 N4 `& ]2 n% H3 X - //新建客户端socket0 a5 c! v/ g1 Y2 {
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);3 l8 A1 r* X6 k; g
- int s = 0;4 @2 ^- J' i1 i2 x1 |
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
0 t+ n. F$ N6 W2 g - 3 |4 o" u+ z/ |
- while (1){
. g1 a, i. N' I) A8 G - //发送数据( I3 z/ G1 F: @
- int a = send(sockClient, message, strlen(message) + 1, 0);
" x8 b; j0 u( P3 F& i% o# \3 ?; Y0 N - printf("to server:");
8 V6 @/ ]) ]- G% M3 E2 l& i/ ~9 I - scanf("%s", message);
' b3 }- |% d) u, F( [$ }
. s& V8 u e0 I7 m U/ ~- }
9 x* K; h6 U8 {# J - //关闭socket
2 s: x, ^8 H; O, x% A - closesocket(sockClient);2 y3 ?1 ]% P' a- H" G; v* S0 D* l
- WSACleanup();( v8 ~3 v" {$ X& P5 d M+ x5 Q
- }
复制代码 求懂的高手来解答一下。( k: a5 M. F% k# C1 ?
谢谢了!
. ]7 x- t. v3 j7 o1 z
7 [4 b. j; x3 _* Z
* M; Q- o2 ^; i K
* S: a1 n! n8 `% E4 p |
|