管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
" i5 [% U1 w9 B4 B/ S6 d我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
% a' r. J7 ?; v$ X1 XTalk is cheak , show me the code.
% M! ]9 {+ j" m服务端代码:
4 R+ C+ k# S4 k- #include<stdlib.h>
! T# v0 `2 q0 t( H7 Q - #include<WinSock2.h>
% r `% t. ], y3 x1 H) t3 ^) a - #pragma comment(lib,"ws2_32.lib"): K& b6 W! q. n, o
- int main(){+ Z# L+ o2 l M$ p5 B1 ?
- WSADATA wsd;1 p4 @. {% R ^1 V( ~+ ~
- SOCKET sockServer;
3 q/ u( F# y' M1 }6 o - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
: N" S+ t2 L/ @% ? - SOCKET sockClient;3 l! ^( ~) m A
- SOCKADDR_IN clientaddr;. e& Y! N U+ n. Z
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ z7 W: F/ h0 _4 i9 P! s" s" G5 z
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket$ O5 L' b0 l7 N
q. l" }/ b2 R( \4 b8 ]
0 @" g* m5 L+ j% W1 C" q* O- if (sockServer != -1 && sockServer != INVALID_SOCKET){* G6 h& \( }* X
- printf("Socket has been created :%d", sockServer);
% A3 Q2 `* z" r5 N3 o - }3 O# I% I' d9 ]
- else{
2 ^8 T; ]$ A. q7 B' U e0 f b3 m/ G4 Z - printf("Socket create failed.");; z/ j9 V/ g0 J% @
- exit(0);. n" y0 ~' F2 Y6 B4 B: V, I
- }
1 p9 i' u5 \9 g' G! ]( T - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
. H1 \ Z+ T8 H7 F& l/ n - serveraddr.sin_family = AF_INET;* X' v9 E' y2 a2 c7 Y
- serveraddr.sin_port = htons(6000);//绑定端口60001 @. a& A6 x) n( K! l4 o
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));! M9 y1 Q5 ]; a8 F% c: D/ _
- char recvBuf[100];1 }! y, ]* B i; O& X1 z
- int len = sizeof(SOCKADDR);
, B; x) M+ M" P) ?4 `) ^ - listen(sockServer, 5);//5为等待连接数& k: m6 G8 V( F) T! g9 G7 [4 m% p
- while (1){7 P5 T; \/ _) _2 L) l- ^
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
0 A4 r- D/ K( J( {$ i - //接收客户端数据+ G- d) v5 B R3 v F# x
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
+ d ]( W: A) z6 | - printf("to me:%s\n",recvBuf);1 Z" w* @' V2 D, Y* L! Q5 A
- memset(recvBuf, 0, 100);
6 Y6 P( }: ~( i4 r2 E0 o7 l - }: I1 L' r# k' i* v
- closesocket(sockClient);
: {7 G- p' F: A2 A" n; z - system("pause");
) ^1 j2 Z: {. G" Z$ ^6 w - return 0;
* y! ^7 K( F6 i0 @6 w6 X - }
复制代码 客户端代码:+ ^7 P4 V+ F- T- e
- #include<winsock2.h>
+ A! x4 D. _2 h5 a - #include<stdio.h>
6 K' o& V0 [3 i e+ n4 s, ^ - #pragma comment(lib, "ws2_32.lib")
$ O, Q$ V6 Z5 w# Z3 o - void main()/ e' e& M4 l+ y% |4 N
- {
) Z' M& `) ^$ Q3 h4 b - WSADATA wsaData;$ r5 z, | |( \
- SOCKET sockClient;//客户端Socket* I/ O" {0 i* X$ N0 w5 C) U
- SOCKADDR_IN addrServer;//服务端地址
$ x, O; V4 X% g& ?, }' |% J. ` - WSAStartup(MAKEWORD(2, 2), &wsaData);; {: u Z$ T: I7 |# A
- char message[20] = "HelloSocket!";
& G7 {$ Q# R/ x8 T/ P - //定义要连接的服务端地址$ E: B, f7 M$ _( P$ D
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
9 C* l3 I% f7 N! ` h - addrServer.sin_family = AF_INET; L1 ]& |& B4 v/ T* [' F
- addrServer.sin_port = htons(6000);//连接端口6000
" L2 M# T' Y+ p8 P' O0 E - //新建客户端socket# V. h8 }2 _& }$ G, R. g) {) c
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
% t- a: k* G0 @7 B. H0 r - int s = 0;) B3 q7 o& B- J- M* P
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));6 B7 G; d: [$ _. | X9 b
- 7 n& w- X: _# m# {6 t/ V3 L% a' ^
- while (1){
+ v5 R k/ A9 k, @' I) k+ s: ~! O - //发送数据
6 o/ [2 H; n5 E: e% W8 J - int a = send(sockClient, message, strlen(message) + 1, 0);' H T7 q# H# F' A
- printf("to server:");4 ~! q4 a/ @7 f
- scanf("%s", message);
$ u2 Y9 u- I$ v4 v - 5 f p( N& G$ _( n7 z
- }
: r( X- |% \$ s8 N- O - //关闭socket
* Z& F. b! V7 Z- x9 V, T! y - closesocket(sockClient);
: n+ R7 G! U1 w- s2 i$ g o - WSACleanup();2 I0 K7 U! I" ^- f! \# N5 Q/ }
- }
复制代码 求懂的高手来解答一下。
4 T! e0 h$ u @谢谢了!) s+ L7 V7 {! T R: Y/ V1 {
2 u$ V# ^: Z$ [2 X7 _1 a
8 m7 f# a2 K0 c9 ~7 X6 _
; u4 d2 x: R% R2 \
|
|