管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
h! Z$ o& `2 |; v9 i ?. v7 l我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。" o9 Z# u& V# [" ?9 f/ S
Talk is cheak , show me the code.! ]. f3 B+ Z9 n% ^5 E# Q
服务端代码:+ P* G' @4 ]5 w3 P% \2 n% N
- #include<stdlib.h>
' K" w a. D! P2 u3 S) F9 s, J0 y - #include<WinSock2.h>
" n' Y4 U) D$ d+ j" E - #pragma comment(lib,"ws2_32.lib")
+ d Q7 G# w/ t( b% d- U" R* o - int main(){
" C0 }! Q( @7 c - WSADATA wsd;
. N" P* H4 d' H" m - SOCKET sockServer;
, j' d& R8 M' Q - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
# p) h% Y9 P2 X* l. h - SOCKET sockClient;8 }+ K4 ^: ^5 j. D" Z" B
- SOCKADDR_IN clientaddr;4 C0 R' G, b3 y* A8 N- c
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口# q* H- |3 S% F+ L1 L3 Z
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
5 Z; L0 Q( C) ^5 Y
8 C) _3 }: Z8 i/ `8 H$ j% P
7 Q. b5 G: G _; |* V$ U" g4 Q# A5 R0 f- if (sockServer != -1 && sockServer != INVALID_SOCKET){
, p+ p6 [+ b0 Y4 C+ b% g" M - printf("Socket has been created :%d", sockServer);
# p# |2 Q: _6 c4 U0 V9 y - }2 v3 e5 x- a9 j0 Q; \
- else{
& c- |+ k* w2 G& u - printf("Socket create failed.");
+ A5 Q; j* o" u - exit(0);
4 x5 n/ k$ K+ X t - }
) O1 a# d! h# k; a, S3 C3 F - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);# t! y0 L. t/ D' {
- serveraddr.sin_family = AF_INET;" ^# n" n8 R8 A2 o" ^
- serveraddr.sin_port = htons(6000);//绑定端口6000
& _2 ^, Q2 C2 Y7 T - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));8 j8 Y( V7 K" g
- char recvBuf[100];
0 T! Y+ ?$ }! [. q - int len = sizeof(SOCKADDR);8 v, n, T: V; x$ W+ Z! E
- listen(sockServer, 5);//5为等待连接数; o) i* l0 ?# Y$ @
- while (1){
5 p* j( m( ]: P) i, D - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
2 I; y$ B7 j! ~4 E% o" h - //接收客户端数据* j/ M" P0 s. ~* Q; C. v/ ?# u( b* _
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);% |2 P4 ]# ~% [% t1 S( q0 T( N
- printf("to me:%s\n",recvBuf);
4 T. G1 n# g1 u% Z8 u1 |1 q0 P - memset(recvBuf, 0, 100);6 _: K: x3 i! Q) l: t
- }+ F. A& V; @/ l- |& T+ }
- closesocket(sockClient);
& K3 w4 N9 x2 y - system("pause");4 j- J; y' Z1 ?; p4 N. M
- return 0;
. L, D2 ~/ T2 S/ P) k8 o! p% t - }
复制代码 客户端代码:% }! v! s8 c+ m. C$ B, C
- #include<winsock2.h>+ H0 O8 [ G$ t
- #include<stdio.h> ~1 w$ k. _$ V
- #pragma comment(lib, "ws2_32.lib"): X, r* }3 x4 j6 A @$ _
- void main()2 e N' k! v4 N% K/ p4 B
- {$ R6 q( r$ t6 r
- WSADATA wsaData;6 G/ Q( o) V7 A( b! k2 U; z L" r
- SOCKET sockClient;//客户端Socket8 n0 a; g& X! z
- SOCKADDR_IN addrServer;//服务端地址
. ]0 v5 k6 m: X - WSAStartup(MAKEWORD(2, 2), &wsaData);: t f* x w5 \ y; L8 I: f
- char message[20] = "HelloSocket!"; t6 ^3 F6 b/ n* C/ n
- //定义要连接的服务端地址" z- Z& X, i: b* b+ U3 v5 F" }, E
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
: L4 T0 L2 v7 M O" K; ` - addrServer.sin_family = AF_INET;
+ N# d" p u/ ~8 K - addrServer.sin_port = htons(6000);//连接端口60004 j2 J: E2 b8 W; ~( y6 q
- //新建客户端socket
a- _ Y1 E) d: N9 o( L1 l2 _ - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* @8 y7 x. i, @1 Q9 H" {
- int s = 0;
8 k* w# j- ? G! i9 m5 A/ X. z) q - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
' H( ^" m; ?% ]+ c - " D) `; J5 f5 j4 w; R
- while (1){) I1 ]' p k. ?
- //发送数据; H% l: k' d1 ^% g
- int a = send(sockClient, message, strlen(message) + 1, 0);+ }3 Z% C2 @8 n3 }8 Z. w8 C
- printf("to server:");
# a& s/ H4 E9 O) c- U( ] - scanf("%s", message);
5 k8 z) n" _0 V
|; K0 r' F- b2 _9 }) C- }
3 @; \+ p0 l. w7 \! Z+ ^ - //关闭socket
% ^# k* _6 o9 d - closesocket(sockClient);! S3 Y* D) B$ j" ^3 d0 X- z
- WSACleanup();" `- K. d% W3 z
- }
复制代码 求懂的高手来解答一下。
# W2 ?5 z( p! E: d+ [/ m, m谢谢了!
* o0 e" q9 _9 r7 Q- e( g% X. O
. ^- {& W5 x" t/ f' E& ]& E. d6 e! R H. T, r1 C6 S2 b v! ^. j
7 g# K5 J& \" s7 T1 r" }
|
|