管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
7 l* J. N3 o3 o) O) D. Q我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。7 M( `9 f9 V' T1 w
Talk is cheak , show me the code.; t/ E! x6 E$ M( f% P" m$ H
服务端代码:; Y+ a3 ?# t0 @) P( r. e$ n2 O
- #include<stdlib.h>* c; A7 k' ], s
- #include<WinSock2.h>9 f. ^, a+ B) W( j+ d
- #pragma comment(lib,"ws2_32.lib")
3 i# B/ B; T3 B( _: l; ~ - int main(){* s# D2 o% _; n0 ]0 n: y; i
- WSADATA wsd;, J. W& ^# [' l( j: T
- SOCKET sockServer;9 U, r) C# W; O' @
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
# B4 U' x9 v D# z, ]/ |8 S" I - SOCKET sockClient;$ q0 k) y0 U7 ]/ Y+ V
- SOCKADDR_IN clientaddr;
- C' Z% X, h; |) q, h; J+ V1 [& L( o. y - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口7 \" U8 O+ J2 o, Q. r
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket) m- W! W) \7 d7 g$ z! G
1 ~, I# [9 w5 K( m/ l- , l# I% L8 u# e# m* h
- if (sockServer != -1 && sockServer != INVALID_SOCKET){: n5 i! U; f( ?' y9 q$ o' @
- printf("Socket has been created :%d", sockServer);: V( l& u- y1 D6 b0 `3 p
- }
+ \; c; W+ N- G7 R% V! G- G) {$ f - else{; J# p! }$ c1 o7 Z3 b9 V# ]/ U
- printf("Socket create failed.");
F: S' L7 x& g, r* i# ]. c - exit(0);
" W( J2 g: ^4 f! x - }
9 u2 g, w; Q! ~! p - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
% g( h; z1 b: T4 j! w- S9 Q, \7 Z - serveraddr.sin_family = AF_INET;
. v4 e$ Z/ [: e+ G( S0 R/ x/ h - serveraddr.sin_port = htons(6000);//绑定端口6000% Y& F. L' l; _3 [! b7 p" f
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
# P8 x, d3 N2 u. W: O2 I - char recvBuf[100];
9 s( y* S0 x$ X/ H ~: Y) s2 ] - int len = sizeof(SOCKADDR);
3 ?/ _, _9 _* ]5 o2 k2 B. ~ - listen(sockServer, 5);//5为等待连接数
7 b2 g% T" v+ v0 ] z - while (1){% ~7 H* ]! U7 A5 N( _: M
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);: r% z: p& M O& ]7 s8 I- k
- //接收客户端数据( b2 M8 l5 E$ Y0 _& m
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
; ]; x9 A9 X6 g - printf("to me:%s\n",recvBuf);( A# q9 Y' g' N; j
- memset(recvBuf, 0, 100);
3 o, |# L5 d5 ]- R! u9 _ - }8 Q. G7 ^/ ~( z; ^8 M9 k0 h V: P
- closesocket(sockClient);% E+ u: v4 C& H$ I8 _5 o* _
- system("pause");5 E5 N4 w- x- @+ q v
- return 0;8 J* c! d5 [) ~4 P+ A T- D
- }
复制代码 客户端代码:7 Q$ D) V& M9 ]
- #include<winsock2.h>
( K* ]6 b. ?. h5 [6 m( o" f* @ - #include<stdio.h>
], w& v2 p z% D0 E - #pragma comment(lib, "ws2_32.lib")
( g5 ~: w" V2 r, a9 a- n* }" @ - void main(). U2 _9 W( k3 ?$ l e) |
- {
$ r" _: }- F$ Z4 t' V; i9 P1 {) T - WSADATA wsaData;
+ M, P X/ B/ _/ u- ?9 J - SOCKET sockClient;//客户端Socket! ~+ o9 a2 a: Z6 \" g( p! R) @
- SOCKADDR_IN addrServer;//服务端地址% L1 n& X' W- ~2 P" `
- WSAStartup(MAKEWORD(2, 2), &wsaData);& A+ B9 z8 b" R* R; \# M
- char message[20] = "HelloSocket!";, \0 t" P: ~# T2 \! s, G; }
- //定义要连接的服务端地址
8 r& P: a* q, K - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
9 g% [, H1 |$ X) I, I z - addrServer.sin_family = AF_INET;
8 M" U1 F' T5 t, A3 a% [ - addrServer.sin_port = htons(6000);//连接端口6000
+ S2 ^3 I& O2 W& l8 Y4 n5 k; A1 g3 ]+ d - //新建客户端socket
! R* t+ B3 R6 U/ {% l3 x/ ~3 _" Z/ A - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
' y7 g- N0 ^3 ]' v, w# D" u0 q - int s = 0;
3 X+ D" ?3 _ r6 T, d* p* R - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
& u+ f7 k3 `" n8 S! A - 1 p8 p W( g& u k, N; f
- while (1){
% n) T- `: ]4 q1 e - //发送数据
7 | r& Y: Z; B. D! z" }0 O* l+ C& f6 \ - int a = send(sockClient, message, strlen(message) + 1, 0);. F8 F) I& [& u- f7 L- R2 o
- printf("to server:");
! ^; M0 H8 e% v! p* r* l9 V# j0 W - scanf("%s", message);+ a1 h: j5 g, {& m4 G
- # u8 {( E& Y. w" I; U x! _
- }. _+ |( u$ n' P% w6 N
- //关闭socket9 q+ d0 T. B/ m/ z
- closesocket(sockClient);! h# N; ]: u/ E! }8 |2 r5 g# C# R3 L
- WSACleanup();6 D4 ^4 P4 D- o# _" {
- }
复制代码 求懂的高手来解答一下。7 z( w& c+ o7 e
谢谢了!* G0 f, H( ?5 p7 I- w6 h2 G, ]
. ?& N# P% U0 \) \ v7 A8 v% j" B
3 A& F) y! x9 `; D
) `0 n6 y# T0 r* [/ S |
|