管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。4 s6 r9 |0 n1 q- Z2 H
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
1 ^/ f( g9 D$ S4 C/ D; \Talk is cheak , show me the code.
8 N0 p5 q8 W' J9 A服务端代码:% p% K2 m0 n! F% [
- #include<stdlib.h>2 r7 D- N! P" o6 j" Y
- #include<WinSock2.h>
; P1 a7 {3 t; E; p! P) C - #pragma comment(lib,"ws2_32.lib")9 I* \& b* d4 k9 D" |4 X. f
- int main(){
+ ?; E, T! v' d+ w" E! S" @ - WSADATA wsd;5 e9 Z- H6 h+ \- A
- SOCKET sockServer;
/ E0 N. v# w7 P' E5 ~0 O' Z8 u - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
0 e2 x! u* r8 D$ H - SOCKET sockClient;" C1 K2 T0 O; K# x+ E2 w
- SOCKADDR_IN clientaddr;/ {/ _ K. r% \& l6 T
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
' N, \4 d* |7 k - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket1 }4 O7 h. C }/ q A
3 e- E$ ~# I2 G1 I# ?1 @% h
$ r+ o A6 b/ _5 `- if (sockServer != -1 && sockServer != INVALID_SOCKET){; h( s/ `7 u4 `& e0 G2 k/ l
- printf("Socket has been created :%d", sockServer);* D7 H4 W4 a; x8 N" Y
- }$ R: V" M' y9 a
- else{
( y3 e6 z1 B+ f4 S" j4 r, h8 c - printf("Socket create failed.");8 ?4 O; H4 b3 A( ?. Q$ C) Q
- exit(0);
; p. f8 M( h6 ~. A - }% ?( w# m8 {- u. ]
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
3 V& P& W, ]8 J) ]" ` - serveraddr.sin_family = AF_INET;7 W S: W7 z1 V. K& v
- serveraddr.sin_port = htons(6000);//绑定端口6000& Y0 n# ?: M9 p3 T7 m( }( w
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR)); y6 i% I4 U; X
- char recvBuf[100];2 @& n( | X; e% M
- int len = sizeof(SOCKADDR);
7 A. ]" f0 L8 d! q, l; q - listen(sockServer, 5);//5为等待连接数
( l/ M( |5 f7 k( y( d# a - while (1){
" S/ ]; y, P; P; r1 d7 ]( Y5 R+ Q - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);+ @. H' n" j \) }. \
- //接收客户端数据( `: X2 D; s8 H
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
# Z9 ]. ?2 J6 ~ - printf("to me:%s\n",recvBuf);
4 ^/ H* g n( K) E - memset(recvBuf, 0, 100);
0 A, Z+ j+ e' k E3 p# u - }0 { ?: X4 m- R# |9 K: u
- closesocket(sockClient);
) P- K! @/ g3 k6 n! ]! ` - system("pause");
6 Y/ E* w7 S% I0 g+ d* l - return 0;
. B6 K# F" s0 w/ n5 x7 K' T4 H - }
复制代码 客户端代码:
9 e6 G2 j$ a4 `! x( v9 s! B" T- #include<winsock2.h>2 | c# n% ]6 A4 h! ]$ U6 [
- #include<stdio.h>
) `/ w v& E8 i, V; M& B" a - #pragma comment(lib, "ws2_32.lib") Q' H% w; I+ V5 l: F2 z
- void main()) E; u) r+ S/ f+ r7 M F
- {* u5 @8 @* i! w0 f, S0 d4 V
- WSADATA wsaData;9 Z5 M. G! m2 S! g" q8 R! s
- SOCKET sockClient;//客户端Socket
- Z0 R2 f- r1 k% {. {) Z2 w' u - SOCKADDR_IN addrServer;//服务端地址
4 d1 \: G7 w% R& ]3 ~" A' S' `- O - WSAStartup(MAKEWORD(2, 2), &wsaData);
3 Z) B9 K6 j9 T& C; S - char message[20] = "HelloSocket!";
* X7 }2 @; y% d( i0 O7 ?0 U - //定义要连接的服务端地址8 R! f! X$ I1 O
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
" [% b1 ?) \/ a4 s) z; C - addrServer.sin_family = AF_INET;
1 t' w6 C) |3 ~( ?" ] - addrServer.sin_port = htons(6000);//连接端口6000& ~9 w+ y9 ?8 T' h1 c: V9 \
- //新建客户端socket
6 x8 A/ F0 }( [# E0 M - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);0 v7 { b, z- u( G5 R
- int s = 0;; @2 P8 w" |6 t+ p) W; p
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
% p8 V9 N8 t2 s4 q
4 Z y! c& ^! D: [" X- while (1){. L& S8 ?1 L6 a+ j/ u
- //发送数据1 B, h" W+ G! d1 f$ P
- int a = send(sockClient, message, strlen(message) + 1, 0);
/ e# b5 g; C" s3 x& I - printf("to server:");
! [" y* g6 @' X0 m - scanf("%s", message);
: J; w" g+ w' ]$ } - ' _- q5 s* b' d
- }
9 O$ s3 w2 u. ?$ {( w4 }) T9 y/ b - //关闭socket
* z- @4 g% j- r$ ^0 E - closesocket(sockClient);
- v& |+ L4 t. t& _5 r2 C - WSACleanup();
8 A$ [0 K2 c7 G; ?, q( ~ - }
复制代码 求懂的高手来解答一下。( K9 U1 u9 h# P6 M5 G1 @
谢谢了!
1 P# ?: M$ T% F2 F
- T% B, ~9 c" P9 O& n
8 w1 U9 G# }- s, j: g; S
% k5 @0 W& Y- l6 K, s |
|