管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。: c+ }! G# m0 `! Y; Z6 R. P
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
* f# _+ ]0 L ?5 ?: Q- y: e5 UTalk is cheak , show me the code.
8 ]5 m* `7 ~% f服务端代码:
- N, s b" f- O- #include<stdlib.h>- t+ y. O; v3 ~% n' O* i. w3 i: A
- #include<WinSock2.h>- T8 e+ i$ `- Q0 \0 c
- #pragma comment(lib,"ws2_32.lib")
; s) s: ^7 J$ f. I1 c9 h - int main(){
( s T3 O# i* l& o7 U - WSADATA wsd;; M: H( p6 o) r; V
- SOCKET sockServer;- P- Z% V- @: ]
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
- D1 y" E3 E/ m% |4 V - SOCKET sockClient;3 v. f! P C- T- L( x
- SOCKADDR_IN clientaddr;) e5 s7 K Q N7 ^/ X( j
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
! B2 e( U9 F5 S9 M. q - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket u( b% _- V+ A1 K7 _ @# `
- 5 F9 U5 S6 ]' u7 K. }' }6 R2 T* g7 {
+ k# Z8 x* s( ^- if (sockServer != -1 && sockServer != INVALID_SOCKET){
& Y- @$ _. u5 p, e0 }! c - printf("Socket has been created :%d", sockServer); V2 @; e5 s! G# f
- }* f' ] k- T. s7 c
- else{7 `3 g: d/ r$ ?: o1 ]
- printf("Socket create failed.");
2 Y3 @7 d3 f* J3 a& Q4 G# I3 d - exit(0);
: p$ p- K$ r/ T8 n - } A/ I3 ~4 P8 c. x
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
/ M# M8 l, Z' l& E k: ^! N& N, { - serveraddr.sin_family = AF_INET;8 ]- O9 S: J" D6 ?5 l9 o
- serveraddr.sin_port = htons(6000);//绑定端口6000, P5 `1 f0 g& c8 ]
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
. c% r4 H# O! d8 k2 A' C - char recvBuf[100];
}/ j0 W3 a7 v, G8 a1 I' K - int len = sizeof(SOCKADDR);0 m6 F: B. Y: ~2 ~2 q) }7 i. ^
- listen(sockServer, 5);//5为等待连接数
9 v* q$ S, D% U. L& K* Z; H - while (1){
" u( ^* o0 Y1 t - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
7 R* z. q& J6 Q6 }% n - //接收客户端数据; d! n: ?9 Q e5 d& I9 z9 I |
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
1 E" Y; M' m3 c4 l) E* {! Y9 R - printf("to me:%s\n",recvBuf);6 L) [8 X+ w/ o1 b& D, e
- memset(recvBuf, 0, 100);: a$ E( E2 s' E- ?
- }8 g3 V: A' ~* z" Q1 f. C7 C
- closesocket(sockClient);
, @7 r% I# k! I" o6 ^: A. X: Y - system("pause");7 ]) [/ d* Y/ ]
- return 0;
: n; C5 b) v8 }' l+ R* x5 x - }
复制代码 客户端代码: P8 M6 ~2 _( e \: }# R3 p3 {; D
- #include<winsock2.h>
+ L9 f6 K9 E. b" |3 m& g( i - #include<stdio.h>! `% V, \' q, b9 t3 m4 H! |
- #pragma comment(lib, "ws2_32.lib")
2 N+ l# S# c3 D. q3 a - void main()
! W' H# y5 p. b B- C - {
+ P) E$ r& O9 a7 t9 J0 m - WSADATA wsaData;
3 l* @# X( B" } - SOCKET sockClient;//客户端Socket7 x, Y6 j8 }: y# A7 y
- SOCKADDR_IN addrServer;//服务端地址
" P- @7 \; A) c! u9 N - WSAStartup(MAKEWORD(2, 2), &wsaData);4 C5 |! S% v v' i. t$ H
- char message[20] = "HelloSocket!";
1 p- w* W: i$ K F$ P. Y1 c - //定义要连接的服务端地址+ }4 \7 J5 k: r+ Z$ l% f
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)/ N \% U# o" k( r
- addrServer.sin_family = AF_INET;
/ y8 x1 _2 h" k* S/ d - addrServer.sin_port = htons(6000);//连接端口6000
9 N1 M9 K' ?. `3 n, n - //新建客户端socket0 G! \& G3 O( l0 h9 d% l
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
, N9 h( I* w1 s - int s = 0;
) a1 g- z( E O7 j4 r - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));; j8 X" t: _& j5 M
% X. J1 h' @* s) n! S) f- while (1){* s( q& D+ E3 P
- //发送数据
" e% T4 s+ z! d9 R; h5 b$ q) b - int a = send(sockClient, message, strlen(message) + 1, 0);
; \& R. ]* _4 v5 q2 B3 j. p - printf("to server:");
( T' Z" r9 ?- a( c - scanf("%s", message);
5 d. ~" D0 y2 m - 0 D& k+ B4 q% M( Z
- }% R3 E$ n; [2 F. {& J3 A X0 T; R
- //关闭socket
& Y2 w0 z8 G/ R* H4 ?$ W, ~7 S. k0 j - closesocket(sockClient);
% J2 ?5 I+ f& p4 Q - WSACleanup();1 d6 k( ~% W; `2 }. N
- }
复制代码 求懂的高手来解答一下。0 ^$ ]. Z# A q1 Q4 o/ w
谢谢了!
5 E) z% Z5 K0 ?: I' M
8 P8 |+ L+ A# u- A; Q8 ?4 f o6 q+ ~ o- a0 u
' \- A& o6 A8 F- q4 V
|
|