管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
' L9 Y2 w5 p% F0 ]我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
! ]3 G. O! ^* b* P% U: KTalk is cheak , show me the code.0 V( I" o+ h% {
服务端代码:3 M( D+ F/ O: _
- #include<stdlib.h>0 A# j- c; ?, R
- #include<WinSock2.h>4 D7 U9 {( {! T; J8 ^9 J
- #pragma comment(lib,"ws2_32.lib")
1 Z# H1 W+ b, [) _% q% i - int main(){
* N7 N, f. ~+ r- c# V: S - WSADATA wsd;7 S1 C; B u6 Q
- SOCKET sockServer;. x+ `( q2 E" z/ y, {
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
! b) c& P4 s3 j1 @0 T1 X, Q+ U - SOCKET sockClient;
+ _ q/ q; T+ {/ B# X0 k - SOCKADDR_IN clientaddr;2 z2 i# A6 i+ W, d
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
. _: T5 z/ j2 e - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket3 K. O* w/ R2 R! I0 s- I! v6 y3 E: r
. U0 k5 M# o- S- L# y- 6 l6 b% [" w/ V
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
6 x8 N. [9 T0 {- `9 r. c - printf("Socket has been created :%d", sockServer);
( s5 ?* A% C6 W8 y4 { - }
, C7 H. Q0 C+ @9 n$ { - else{/ Y# z" F2 x% p
- printf("Socket create failed.");: T1 N' B$ ?+ D
- exit(0);
) W$ ~) Q( @$ q6 W$ s, `5 v - }
; F2 R& A! f+ C! s9 E - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);" r& b4 K5 e7 \; J
- serveraddr.sin_family = AF_INET;
! B$ @% Z9 R& ~# }, ~: V, ` - serveraddr.sin_port = htons(6000);//绑定端口6000
1 d+ ~2 U: e* }# o; y - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));' i4 E3 x5 a3 X6 K! E6 f
- char recvBuf[100];
0 ?# G5 b! L1 ~- t9 W% F - int len = sizeof(SOCKADDR);
& | V4 u8 [: X& {7 z/ { - listen(sockServer, 5);//5为等待连接数
5 U/ f7 Y& { [ I8 d - while (1){
5 s; m; C2 _7 {4 c. H8 a1 Z/ [ - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
* Z/ e) I* j6 H/ r4 H - //接收客户端数据& Y/ Q* ~. Q3 A1 a
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); i+ `- t N6 H- G0 l
- printf("to me:%s\n",recvBuf);) A3 B( Q; v9 c4 F, [
- memset(recvBuf, 0, 100);3 F! ?$ \' b, e7 p+ k( g2 r
- }8 S. A& S3 v+ e- y
- closesocket(sockClient);: g! C0 a1 E4 f3 p* X+ x
- system("pause");1 b2 ?) Z- s* o7 c+ X: w
- return 0;
+ H' h) E2 T& ~$ T7 ~) y - }
复制代码 客户端代码:1 M3 m! B& O4 A) D
- #include<winsock2.h>' v7 g1 S% T5 J" z
- #include<stdio.h>
( N- x* z, [5 p, N - #pragma comment(lib, "ws2_32.lib")
( H1 R( b3 v2 |6 w: D3 s9 G$ i - void main()
8 p7 o( p4 Z( A' e" m+ I - {0 r* `! C8 F$ k' |7 j6 S
- WSADATA wsaData;
8 j* s; E1 I) ~: p6 O1 g/ k$ t - SOCKET sockClient;//客户端Socket% _) G. t4 F. g. C- s! |% W9 n) L
- SOCKADDR_IN addrServer;//服务端地址
$ j7 R3 x1 Q, I9 t h; m - WSAStartup(MAKEWORD(2, 2), &wsaData);, {# I8 M4 i e
- char message[20] = "HelloSocket!";
1 ^0 c# o. y; y" S3 | - //定义要连接的服务端地址( ?! j4 `9 ~7 F- ?4 C7 ^6 O! t
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
) ^. C% U4 @6 _3 f - addrServer.sin_family = AF_INET;
7 [1 L9 b% Q% O; j - addrServer.sin_port = htons(6000);//连接端口6000# I( K6 K( T: V. H* r
- //新建客户端socket
0 k) q8 |5 C. J4 Z - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);# j( Q& N5 K1 E* N7 L5 z
- int s = 0;
# `! Y; x0 {0 s6 |( r- f - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
. x7 A }1 w- F ~9 @" ~+ A0 g5 l - + s0 v$ M6 l, V6 L2 ]+ ^% i
- while (1){
$ F m# v8 o8 m6 K: ?) E7 q - //发送数据) j7 n& [* a. G% b! L
- int a = send(sockClient, message, strlen(message) + 1, 0);
6 ]/ o) L" T0 V2 E9 Y5 a) B - printf("to server:");
! B- A" I; c8 @- A: d: o - scanf("%s", message);
# u0 X+ Z# o/ _$ ]/ Q) V' J
: J$ ?) c) R2 G4 U2 X- }
1 Y/ c; o9 m8 x! I# I7 N - //关闭socket: S( g: B' @! Z# T! I4 H6 |. k D
- closesocket(sockClient);
( r. q" p2 s+ g6 y5 }# Z6 j - WSACleanup();2 C) i- z; K+ i: D: H
- }
复制代码 求懂的高手来解答一下。
: L$ W) M: M* \9 v% R, s谢谢了!% l. M7 k( | _8 x
% x, T9 z" [2 t( _) N
5 i& a1 L) m, D8 o
2 `$ R6 P/ [4 l. d% W4 \* ]: W7 @ |
|