管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
. h K, `3 w% h; `我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。/ [1 z4 _0 J" G/ ]
Talk is cheak , show me the code.
3 W7 C# W k) C6 m: }4 H. g服务端代码:! J0 i* W) {2 K+ D
- #include<stdlib.h>4 k. A& R* i H# v
- #include<WinSock2.h>+ |+ h/ o% m. F0 b3 f
- #pragma comment(lib,"ws2_32.lib")) f7 G6 T% M" Q( a/ G
- int main(){
, M+ I% a2 D/ r, ~# _ - WSADATA wsd;% J# q) K: u( I' N
- SOCKET sockServer;
. c+ l2 `/ Z2 a% A) e - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号& Z& R: k# H1 ], K( J0 C. X
- SOCKET sockClient;: d; z( C% \. r/ }4 J. ?- _
- SOCKADDR_IN clientaddr;# }& {9 Y0 p. i8 [1 j T
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口; p; b- a8 F" l9 r! ?' L# k0 C: `
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 s: Y- t; t4 f
- 2 d6 t; j, ^# l7 X- P6 B
- _' j. `9 U8 Y0 Z3 _- if (sockServer != -1 && sockServer != INVALID_SOCKET){
4 C/ b1 U2 o# f& D" J4 ^+ s - printf("Socket has been created :%d", sockServer);$ i* Q& n9 ?5 N3 @+ H) U# U2 y
- }1 i# _6 L, J( m0 K$ t$ `# C! R$ V
- else{
3 O$ K: ?* w7 n9 }% [ - printf("Socket create failed.");
' U& c" E9 D5 K9 H* @$ y: G! ?# y - exit(0);: ]) B x" y- v1 P: ~
- }
: @( \9 C$ Z8 U/ H8 ] - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
) K3 f* _$ \* x6 J: m5 ~ - serveraddr.sin_family = AF_INET;) v5 a: C. ^2 a7 d
- serveraddr.sin_port = htons(6000);//绑定端口6000
* g6 C7 @; [- n& B* c5 m - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));" [/ A5 M, E& M4 S: D
- char recvBuf[100];1 Z& S% Z3 G; [
- int len = sizeof(SOCKADDR);4 M7 W' F& u8 Q: I- d- [7 U) ~
- listen(sockServer, 5);//5为等待连接数4 d% ^& h' U5 Q
- while (1){
0 `; |: x1 L2 R/ U" X - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
# }8 i% B! i7 G6 ] - //接收客户端数据
! i z6 m2 w6 S5 w( I - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);- J# ?+ @* }! F
- printf("to me:%s\n",recvBuf);& c( n6 ?7 r7 K
- memset(recvBuf, 0, 100);
- U& }- i1 Q5 S4 N& Q' A5 X$ [ - }
7 T5 J: j! S7 c - closesocket(sockClient);
9 j. U- V( [2 m6 G* P - system("pause");0 W9 ]; Z. A. P1 P* n
- return 0;
1 X+ n1 r0 T, x4 G* p5 ^" b - }
复制代码 客户端代码:" y* ?# e% [9 c8 O X5 h) p# r
- #include<winsock2.h>
# d: y% s1 ~+ H* x4 V5 x$ h - #include<stdio.h>
7 k6 o9 B# V% } - #pragma comment(lib, "ws2_32.lib")
/ O W* c7 H! l/ S$ {; f1 e+ a - void main()
( o# K$ I% I5 n6 q - {4 E. y2 C* n% d' |: @' s
- WSADATA wsaData;; Q) X+ P' ~: x/ p9 k
- SOCKET sockClient;//客户端Socket$ j6 H) e( [9 O8 t/ b) L, ?! \; u
- SOCKADDR_IN addrServer;//服务端地址
$ s( X* M3 s$ ~9 d2 U- w - WSAStartup(MAKEWORD(2, 2), &wsaData);2 j5 j8 F, z* J& r9 ]& n) O' q% h( |! Q8 e
- char message[20] = "HelloSocket!";
( K' T/ A: v2 I; ^8 c0 f2 w6 G P - //定义要连接的服务端地址9 ~6 Y3 [, |1 \% n+ E: J
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
/ N6 J# G4 D9 p* J8 H( x4 _& q - addrServer.sin_family = AF_INET;
0 w( i, B5 b( g0 }* T. x4 V - addrServer.sin_port = htons(6000);//连接端口6000
0 U7 E/ P; W% m" }" F( T - //新建客户端socket4 Q7 f% T; B/ D( e# q
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);+ s1 S0 I& X1 Q* {4 |0 }6 k
- int s = 0;# `3 S. l, z$ v9 `1 W D3 U
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));/ t p4 `/ i. D/ I) p8 u' q
- + v% P) f! _6 }# A3 S& h, E0 R
- while (1){
7 @0 F. s8 J6 c; _& X8 n - //发送数据
1 T0 e6 ]" j, x3 n7 p; e5 `" n - int a = send(sockClient, message, strlen(message) + 1, 0);
U8 I6 i+ W, e+ t, K% L- z/ o& u: N {" L - printf("to server:");
* H* j6 W1 J) K# ~ - scanf("%s", message);
3 V- k" g( c& h+ J7 H. f( S
6 g$ R7 I# r+ v- }
6 O% Q# N$ u0 t N: M) V) s - //关闭socket
! U+ C- }' K2 D. v; h& U - closesocket(sockClient);6 w( c% z9 E) G2 M
- WSACleanup();
+ F$ H+ V! f/ x4 K" P - }
复制代码 求懂的高手来解答一下。
# ?3 H+ X7 d8 [谢谢了!1 |6 m5 n0 m2 x* C
/ ~/ C1 |* u+ A( k, @2 a: R' J
2 c# q" _, ]" S% F2 b
! V. c, u- u; n. m |
|