管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。8 C9 V, Y) }1 _* [
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。4 b$ F( c: u" C: f8 j0 _
Talk is cheak , show me the code.
% I7 O, g$ q5 O1 O3 E2 }$ F服务端代码:
3 A Y w0 F0 E0 u7 f: I$ q- #include<stdlib.h>
) h2 [" x& q! m8 v+ ^% D - #include<WinSock2.h>0 O! o7 H) E! f. h( T0 \3 a
- #pragma comment(lib,"ws2_32.lib")5 V& @( t, D5 Q# x/ q \
- int main(){
9 R- C" R8 C: F* M$ V7 D - WSADATA wsd;9 L# u; Y" ~+ \
- SOCKET sockServer;" k& u& { e- f0 D! o7 H$ q
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号 _0 S9 }7 m# l( M/ T0 w/ y0 h
- SOCKET sockClient;/ a. c ^ w9 r
- SOCKADDR_IN clientaddr;7 p; `" I2 d+ F/ e
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口, J7 G4 x( c z1 r
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket. W$ [, L9 p1 I/ |! u1 `5 q' S7 V
- . @: B7 n" M% Z" Q: ^, q+ n2 t
- . f1 F0 e% N0 ~8 Q! P# m. J
- if (sockServer != -1 && sockServer != INVALID_SOCKET){( t; M5 {5 ^* V9 n5 |
- printf("Socket has been created :%d", sockServer);6 W* J( Q0 q0 e9 D$ _
- }
0 q, n9 S! a' y y - else{
( ?0 Z- D2 E4 |" l2 B" a) V - printf("Socket create failed.");
+ P( W7 d6 g. o- {1 ^ - exit(0);& K! p- v' v: d# @6 O5 e) y, E
- }
8 w) R/ ^1 r+ Y - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);* t4 W/ } b3 z' L! r/ O
- serveraddr.sin_family = AF_INET;
/ F. j" s1 Q( B0 V' Z I - serveraddr.sin_port = htons(6000);//绑定端口6000
) z, y7 E, X/ @0 a N - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));' L9 K' Y5 \4 a7 i8 J$ H" I7 _4 _
- char recvBuf[100];
) h% ?1 G2 ~' N( e" J - int len = sizeof(SOCKADDR);
, C% k; u; F9 p+ x* m) `6 l - listen(sockServer, 5);//5为等待连接数
# R" D( z. x( N' A$ W - while (1){" M8 h& s6 E8 ^" ~+ ?5 i5 j" U& y
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
9 y2 \5 k ]4 U2 g4 t$ r% H - //接收客户端数据+ a# B- b6 P, K
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
2 X. N$ d! u; D D9 s; P) G/ {# u - printf("to me:%s\n",recvBuf);
0 [' [9 C/ y5 i' D: h$ w+ |0 f - memset(recvBuf, 0, 100);+ u* T) u4 e% [: m3 K) o5 z8 @
- }7 }" L: I, n0 S6 @) O7 z
- closesocket(sockClient);. p6 \1 g. b. X1 Q9 |
- system("pause");) v/ d! T/ K4 ~. d" ~
- return 0;, R1 h) R7 P/ T' u6 W6 s( x
- }
复制代码 客户端代码:
0 X9 u0 B0 {9 f; o# P3 u0 Q' w* {- #include<winsock2.h>
# }, ^) x4 b% L7 m - #include<stdio.h>
- z& X/ ~: M* b# _6 L% O; ^ - #pragma comment(lib, "ws2_32.lib")7 j- B* o; g7 ]% I7 g7 f
- void main()
6 Q* x3 Z. f; o& w4 O" h - {- ]. p6 f6 E8 n0 u4 E
- WSADATA wsaData;9 \ p3 c3 c5 @8 c) ~
- SOCKET sockClient;//客户端Socket6 y; S/ W" r( |( f
- SOCKADDR_IN addrServer;//服务端地址
7 l. k( D7 ?# ~3 F- V - WSAStartup(MAKEWORD(2, 2), &wsaData);$ T1 X1 k# X7 F, q9 Y: {
- char message[20] = "HelloSocket!";7 G/ |* U# Y+ @1 g
- //定义要连接的服务端地址9 U2 r' S: f0 k; L1 r, K) I
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)/ I- N. T1 l3 t7 k: `+ U7 F
- addrServer.sin_family = AF_INET;
. O: L3 X. |' O& M# w$ `% D - addrServer.sin_port = htons(6000);//连接端口6000 s+ i% q8 r& K3 {& }
- //新建客户端socket0 v/ X9 u% Q* p& W8 C& {
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2 G" E. H7 c8 s6 G - int s = 0;
( q- ^+ Z. ?( a% ] - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
) }0 E# [4 }; `* ^- R - - C5 r/ n! z4 {! ~; Y, k
- while (1){. j7 E6 w) r+ R: r" a/ V* X. R6 V
- //发送数据
$ n) k+ B' v& I" f7 z - int a = send(sockClient, message, strlen(message) + 1, 0);# a7 b" R9 U8 x6 V/ E
- printf("to server:");0 H' c- Y+ y: i8 Y1 j8 h
- scanf("%s", message);
% Z/ J4 [! g" O6 N
& K# ]4 Z0 }' _6 S1 X* a- S: a- }( a" M6 M. u0 @
- //关闭socket- @- v( @" G; d m, ?2 d3 k
- closesocket(sockClient);
% i: U2 x2 c" Q' I - WSACleanup();6 s+ k) c' }' t7 ]2 u8 ?' ]
- }
复制代码 求懂的高手来解答一下。. }, G1 |% I9 V+ `9 h$ \9 i0 b
谢谢了!2 }1 ]8 a* m8 ?5 y
4 m# J: Y* g* {, T
- S6 A. e3 f, R; D
5 e1 f9 K- H: y+ z& Y" z
|
|