管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
+ w+ i' q3 Q5 o我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
1 ^6 E6 e" `, W; [5 q) P, n$ `Talk is cheak , show me the code.# D: ~( i: P. i* F5 i) L
服务端代码:
, |: b: E+ Y" y! E6 k1 I' M' r- #include<stdlib.h>
3 M" B- u$ o: e4 ` - #include<WinSock2.h>
* i. J4 B0 J$ | v; ^' n2 t: L2 N$ r - #pragma comment(lib,"ws2_32.lib")# r5 {- \1 S& g2 c, l
- int main(){
2 H4 {! S4 y& P* J1 C! k( g - WSADATA wsd;5 q1 o7 p* Q7 ^! o( U
- SOCKET sockServer;
: ~: H% m7 Z1 Z1 t2 I8 V - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号" ~# R) {% c: z
- SOCKET sockClient;
* s. j$ p: i1 {& V - SOCKADDR_IN clientaddr;) q5 O5 @* D9 x
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口+ g! ~4 I' v; ?& W
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket3 \9 V; h" m1 F2 |0 I$ P( D: \
- $ d. u8 V a/ {4 H, ]6 [
- 8 S% ?# c# a; t8 Q3 K0 r# D9 p
- if (sockServer != -1 && sockServer != INVALID_SOCKET){ a$ e( M2 ?7 M- f. {9 C. B
- printf("Socket has been created :%d", sockServer);
- j# w" |8 G. X8 ] - }
+ l% G$ Z& I6 g# d3 N6 p - else{+ @8 w+ d5 M' Y
- printf("Socket create failed.");. s: c) M) {" l3 x
- exit(0);
4 f0 n% A1 B6 U - } d3 I. ^3 z4 z$ `1 g$ i
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
% D' q; q+ O) k. a5 i- i - serveraddr.sin_family = AF_INET;$ T, p' T' I. D R; U
- serveraddr.sin_port = htons(6000);//绑定端口6000
+ C/ x2 M$ H5 x9 l. ^3 p: q, C - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));; s5 ~6 _7 |& N, w$ F
- char recvBuf[100];- x, F+ D) u3 a( Q; D
- int len = sizeof(SOCKADDR); O; P, ^+ F$ X8 I* y4 b
- listen(sockServer, 5);//5为等待连接数
; v' e5 Z ^* l9 T - while (1){# R4 K6 ?0 O% Y) w' q; t
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);# }6 E @& V3 \( c* f
- //接收客户端数据4 Q P7 v: h8 j. i
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);+ O, @. J! S/ _; d1 z
- printf("to me:%s\n",recvBuf);9 @& e4 b5 J% |
- memset(recvBuf, 0, 100);
+ I/ J0 H; P3 n: B* \ - }
5 ~) `2 m) |7 z1 k" D) u' f. M6 ^( T. X - closesocket(sockClient);
5 u$ R( ~! Z' |3 u - system("pause");+ I8 N/ L2 y( A) s. T( K
- return 0;
' d2 A# k; Y4 X - }
复制代码 客户端代码:
% c* A+ |- K' u" y- #include<winsock2.h>
( S5 _# g/ q8 Z* F - #include<stdio.h>) a( p% g* \5 w1 }. u6 A( ~0 G
- #pragma comment(lib, "ws2_32.lib")
' o [2 A) m9 J8 ^, v% f# W - void main()3 r7 p- X& p/ \
- {* B, t) p9 O; E5 _
- WSADATA wsaData;
) c p6 r4 I! k8 O i( k$ ^ - SOCKET sockClient;//客户端Socket
G8 D0 s1 d; C6 a; c* A. V& f1 p - SOCKADDR_IN addrServer;//服务端地址6 c% V( c! U4 ~
- WSAStartup(MAKEWORD(2, 2), &wsaData);
5 d: U, r. V' a* c/ H' @* x - char message[20] = "HelloSocket!";' c8 m9 s7 c+ Q: _ v( L2 J1 Q
- //定义要连接的服务端地址
/ [9 o/ w" G& p- w! D - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
, p2 _# L& p0 U0 Z% D5 P - addrServer.sin_family = AF_INET;
0 U! g9 Y6 n: {! f$ E8 Y: W, s! V/ H; N# H - addrServer.sin_port = htons(6000);//连接端口60008 t9 S) H" u- H+ e8 G ^
- //新建客户端socket
7 C1 }6 C6 V1 i - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
" L- o( k# a) s& `- K* T7 L( l7 ? - int s = 0;0 ^2 n# ?$ k5 K$ ?
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));4 p$ B3 @1 u2 M0 e D
- ) w* r: d) Z6 p+ [% d8 u: w+ x
- while (1){3 Z f4 e4 x C& w! [
- //发送数据
3 s0 a4 h* C6 Q3 k# E - int a = send(sockClient, message, strlen(message) + 1, 0);3 J0 k8 }8 v9 z0 V
- printf("to server:");
. ^0 i' M0 O6 G - scanf("%s", message);
" J5 x, u; T9 H - ( m' C. S1 [' q! j
- }' J" W1 Q% [: V1 s+ b
- //关闭socket
4 c; T. E1 T% R: |$ C3 H. b: M - closesocket(sockClient);8 Z/ C$ r1 J; e
- WSACleanup();
" ^ [* R: x4 p! j1 T# w - }
复制代码 求懂的高手来解答一下。$ B' }; F, w1 w( M3 }1 d
谢谢了!
& U4 h4 [7 N& O7 u* c6 \! i; m! C2 M6 c& [
6 L1 K$ R+ |6 S% R
2 U* w5 q3 C7 i+ d7 ?3 m |
|