管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。0 D# m |) f) A
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。+ d7 |1 b- j5 y7 W# c. l
Talk is cheak , show me the code.
# C, g! Q/ a' W8 R0 W服务端代码:
. Z6 W, g! J) r8 E* ?, W9 w# _3 s- #include<stdlib.h>
6 @: a: W4 u8 d9 f - #include<WinSock2.h> @- ^! _& B! n6 q- w* D. u5 |4 x
- #pragma comment(lib,"ws2_32.lib")/ H% \; N" h9 A5 p, a: n' u/ Q
- int main(){
* G( R5 h2 ]9 g% J5 U% z6 Q4 n5 d - WSADATA wsd;
* B n- ^# [- |1 D - SOCKET sockServer;. b2 b6 L* Z* Q. Q' G# V/ j7 E
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号$ {# S; h. {! A2 u
- SOCKET sockClient;
) C s9 Q# V# E2 c - SOCKADDR_IN clientaddr;
, G6 e% H& T' h( _% ` - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口% t, g; L$ D% b7 r
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: r9 Z# w. Z$ u
- 5 e/ V# c) s- o
- 5 ]( i6 m8 K$ w, u" |0 l
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
3 G* q1 m$ P; J$ n! z% H* e - printf("Socket has been created :%d", sockServer);
8 j! d. C. _- P7 ^; i. H1 r+ Q3 ]' g* L - }
4 }0 A; r7 D( ^, q% C9 o) ]/ T - else{% m1 H2 ^# d+ }2 ^
- printf("Socket create failed.");4 Q; w& p" J3 ~
- exit(0);
) S; T9 D1 O5 M9 p- q+ P' p- | - }
4 z7 Q- M. z7 Q1 J$ V _ - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);+ G# d2 V5 Z( S J& E6 i
- serveraddr.sin_family = AF_INET;5 J" E6 O5 T! z- `* U# R0 g
- serveraddr.sin_port = htons(6000);//绑定端口6000( H/ s6 T& V! v3 Q; n; j
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
8 ^' k: h0 g' X" I: w( p - char recvBuf[100];. {5 D; B! Y. a- y2 Z
- int len = sizeof(SOCKADDR);( _/ b4 f, w# ~% M' Y
- listen(sockServer, 5);//5为等待连接数
+ j3 Y/ I7 p6 S- m. ^ - while (1){" z3 M; M) E) q4 |
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);/ }1 Z3 E5 c& L7 P- M5 ?( q
- //接收客户端数据9 L% G2 o* d' h/ _5 y0 V
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);6 w4 N" |" l9 Q
- printf("to me:%s\n",recvBuf);- Y' R5 }8 }5 @5 ?1 {
- memset(recvBuf, 0, 100);
( ^3 h6 i3 P5 P4 P' d. l2 y - }) Y; U2 [( u9 l- C4 E F2 w6 S
- closesocket(sockClient);. d- T8 K8 J6 i" M" B! m
- system("pause");, r% N. A m) b b! z! k
- return 0;
) j8 W# N: @0 A* f - }
复制代码 客户端代码:
1 e& c. j% F. ~ j1 B, B. W- #include<winsock2.h>% Y2 a' q1 _) S5 E5 v/ Q$ f' P+ y* {
- #include<stdio.h>6 b6 r3 p. S2 J! A
- #pragma comment(lib, "ws2_32.lib")& b3 ]# t0 N2 d5 y; Q
- void main()5 Z( [0 ^; x. T& a
- {7 t: P3 W( Z( p* U% L- m: I
- WSADATA wsaData;
- o! N7 t2 m( F3 [- w - SOCKET sockClient;//客户端Socket5 q0 O( r I5 X" M$ _
- SOCKADDR_IN addrServer;//服务端地址
2 `5 w. k3 D$ X* T5 | - WSAStartup(MAKEWORD(2, 2), &wsaData);
8 M' W; {8 C3 g5 f9 d2 w - char message[20] = "HelloSocket!";
1 q6 e/ A9 c) K4 M - //定义要连接的服务端地址: X! i& |1 \5 _
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
& ]: f3 M, L# T1 R. r. O9 l - addrServer.sin_family = AF_INET;! I. J& j. o9 P& ^5 X, G) s; ^
- addrServer.sin_port = htons(6000);//连接端口60004 t- d R) A- a& ^9 ~
- //新建客户端socket
1 U! \2 p! P; C; l1 W) ~2 c - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);8 r" b6 a' I+ B: M9 \5 B; M
- int s = 0;
; }, q" x9 z. V. Y6 {" t - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
( l% W8 z4 ?+ f3 O1 D
+ }: `$ ^) O [! Q- while (1){5 W. ~) S. a. z* B+ |
- //发送数据
' z7 W% h8 f2 C3 Y* Y - int a = send(sockClient, message, strlen(message) + 1, 0);
: n/ L7 E1 C6 Y; e& W( B, U z - printf("to server:");/ k$ B, ^7 _( a( R3 ?
- scanf("%s", message);+ _* G, c4 V: T) C
$ b6 C& I: u0 ~0 O& N( b2 h- }
; R3 R4 _6 v+ m" q3 R - //关闭socket* q* t: z4 w# A5 w J( K
- closesocket(sockClient);- V+ e- c/ q I+ H% V/ N% t
- WSACleanup();& V% n/ D& W* ]0 T
- }
复制代码 求懂的高手来解答一下。! o$ }+ L$ D6 n7 N& i
谢谢了! \+ F, z# L: w1 A) M& ]( x$ E
2 p F+ m% t- ?* M3 g1 }7 W. A; E( ^+ ?- a0 W5 t0 ~) x
* ?# X6 \( q* `& M( k J |
|