管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。* L( X9 \4 M5 l L$ o+ O" ^6 n# _
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。( I$ W2 m- Z5 f( b- z
Talk is cheak , show me the code.+ d; o% x( |0 T. e8 h
服务端代码:; F9 z! Z& }, j9 L; j
- #include<stdlib.h>: }8 M9 a* X% E& S/ D7 w- f
- #include<WinSock2.h>2 R2 r6 P4 x/ b. H4 @
- #pragma comment(lib,"ws2_32.lib")' K: L( t% w0 l& o) {
- int main(){) {- g% O: @8 p& W
- WSADATA wsd;
! e- S6 |8 G L2 o# I" O - SOCKET sockServer;
7 ~; g3 C, P6 H+ q+ f0 v - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
2 L( _% ^* k; k$ } - SOCKET sockClient;
) {6 g) t5 F' A0 `$ y - SOCKADDR_IN clientaddr;
7 I, j! U% b; g& m% u - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口: l9 b( Z9 P' F% T. A. W
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
& }; p0 l* w& g/ U4 `- l - " ?! E. r7 w4 v2 r. s5 b. P
- / C: c4 E2 \: p- W4 J+ P( N" ^' Q3 m
- if (sockServer != -1 && sockServer != INVALID_SOCKET){# `5 T% p/ N7 `- `& ?/ V0 ?/ L0 o9 i
- printf("Socket has been created :%d", sockServer);
" ?) K- g6 C% H! O8 i - }, x r/ ^4 [8 Q5 Z' q" {3 c
- else{
6 b% @; @0 A" \- \- _4 K3 o - printf("Socket create failed.");
& r- Z5 O% x4 V6 l/ u2 ?+ [ - exit(0);
- C/ d! V& ^, k" x4 _5 F. l. q2 F - }# A% A/ t! A) I4 R
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
8 d+ e' V& q; W/ l: G6 ?0 U) h7 o - serveraddr.sin_family = AF_INET;. c+ ]8 a& d$ @ D4 T! @1 @* f
- serveraddr.sin_port = htons(6000);//绑定端口60003 D; n+ W' _; D3 e# x3 r, v$ L
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));- Z/ D8 K! M$ C! O# p" G5 a
- char recvBuf[100];, H/ i" s7 Y7 c. `, q
- int len = sizeof(SOCKADDR);
; p3 B0 ^4 I1 l: F: a! c - listen(sockServer, 5);//5为等待连接数
; @, `8 N" X) N1 n' q5 |( f5 G4 b$ A - while (1){. A& h, l3 |5 V! Y0 A. l) W
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);% h2 S* ^% t! Z6 R! F7 O: E
- //接收客户端数据. x) Q8 ?" e0 ?1 Y- v# ^" T0 n
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
! g1 C6 z5 B- |1 N - printf("to me:%s\n",recvBuf);
0 w9 O7 e) j4 _& |8 ^' S - memset(recvBuf, 0, 100);
" k' T# z- E/ J2 M& W - }
7 j: u X" U( O7 w; Z3 ^4 L - closesocket(sockClient);
/ w% i3 u Q9 O% b7 T7 d - system("pause");
& h8 P# x- k1 v; g8 } - return 0;& {5 Q7 J6 W0 B- ^
- }
复制代码 客户端代码:
* w+ s" m4 M1 \+ N. V8 a- #include<winsock2.h>
1 w3 [% r0 r! B% W - #include<stdio.h>
3 G/ b2 j: c$ | - #pragma comment(lib, "ws2_32.lib")
& J# j* G% C5 K% v! l - void main()8 u0 t4 z3 E P7 a. c* H
- {# |% \ o7 s3 e8 U
- WSADATA wsaData;& e n3 v, q' d- C: n
- SOCKET sockClient;//客户端Socket Z h2 X' _/ T& I3 T* q
- SOCKADDR_IN addrServer;//服务端地址
0 T# c, c: {3 b- w+ E' L. J - WSAStartup(MAKEWORD(2, 2), &wsaData);
( {# h8 c9 R) M, v* T) N - char message[20] = "HelloSocket!";( N2 i( |; B0 v2 `. E& P* R
- //定义要连接的服务端地址4 }2 f2 E z9 r) @1 E; G6 [( m: f i9 U1 W
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)$ {4 n& I5 U0 |( I, J9 H
- addrServer.sin_family = AF_INET;+ }7 I) S4 {' w9 [7 j% W$ C
- addrServer.sin_port = htons(6000);//连接端口6000
* i: I4 H4 U* p - //新建客户端socket
: ?6 @! a$ q% d/ l# W9 U$ L6 y - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
0 {, y1 V; l% h. C9 }7 l - int s = 0;4 {5 I3 [! W& e p
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
& e7 q, L! W; P7 `2 V6 g; c5 l8 k
) Y% Q+ a; n d7 ]- while (1){' p# G. J: Y* y! r+ f& b) I
- //发送数据
8 ~, L+ ~1 m! P) l/ J - int a = send(sockClient, message, strlen(message) + 1, 0);$ V( A u9 h1 O3 N0 y8 r
- printf("to server:");0 g$ Z7 H2 q; e$ M6 M+ L+ [8 T
- scanf("%s", message);
h; }) x5 ~" M$ \
7 u2 E0 p$ w; k+ g6 g- }- v. I4 ?7 u4 S% {
- //关闭socket
- K1 ~' v. A4 P f - closesocket(sockClient);3 }) S* }% r4 O
- WSACleanup();
. D4 `* q0 a, g - }
复制代码 求懂的高手来解答一下。
) |. i7 Y9 B0 i0 V谢谢了!
, t8 C2 l6 m8 q1 v" |- ^9 n8 f
2 B6 F& Y+ x/ Q1 o" {! k* Y6 K0 v" T% ~' ]; `& ~0 \) B
) W" m8 R2 L9 B |7 U: R$ ^3 O
|
|