管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
. O$ G- z* s, o9 b我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。5 Y. K/ u2 w; F# m- W4 c. R/ Z
Talk is cheak , show me the code.
- n- s5 ~1 S1 N2 v; B服务端代码:; w' r7 x: N) G
- #include<stdlib.h>2 {: @% ?- p# m# c; \
- #include<WinSock2.h>
9 B7 H1 y6 O9 d3 t - #pragma comment(lib,"ws2_32.lib")0 U' V; k g$ x+ L& z
- int main(){
7 ?/ k! C( p: U4 H+ U" z: _ - WSADATA wsd;
8 s/ L0 L: B' ~ - SOCKET sockServer;) j1 x8 X, V3 U& ]1 i
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
& P$ B! x; X4 Y3 z6 q+ o - SOCKET sockClient;" s6 n& g4 |9 {- I8 O7 L/ J4 b& P
- SOCKADDR_IN clientaddr;
$ ^! j/ F" h% J. y - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口! X8 X; q: N& z! `; e8 | k
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket( @9 J5 q1 j2 F; G
( z2 T9 U( }& W; w6 R- & V% W; _2 c, G4 q7 u
- if (sockServer != -1 && sockServer != INVALID_SOCKET){6 C \) [5 l# g2 W% K
- printf("Socket has been created :%d", sockServer);
: g3 d5 b5 }4 \) C" U) U+ f - }( ?$ M0 U7 A* C! t% I/ S- h1 t; P; H
- else{: \3 x" \+ w% ^* _- x4 ~4 L
- printf("Socket create failed.");+ W, H1 C& i# t* W U
- exit(0);: p) G+ l/ l- R# A9 E \* x
- }1 M0 L- t- I) l: q: ]. G
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); t" t, h3 k ]
- serveraddr.sin_family = AF_INET;' R9 Q3 G |2 `7 E" H
- serveraddr.sin_port = htons(6000);//绑定端口6000
@8 S* \& t( x N - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));& h$ m2 Z+ U6 Z
- char recvBuf[100];4 I/ T# u+ U3 W7 q9 Y$ h6 n
- int len = sizeof(SOCKADDR);1 i- D& T" ~5 l7 I" l! E
- listen(sockServer, 5);//5为等待连接数
. D4 F0 L/ }. W( E( f; v - while (1){
5 e' w5 z# E( g% N - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);( Y# A( V. M) f( w6 e
- //接收客户端数据2 g8 l/ b- C3 Q, x' s8 B5 Z
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);2 J- h( W v) i! } N
- printf("to me:%s\n",recvBuf);) f$ a$ j6 F+ j; x/ |8 [5 y
- memset(recvBuf, 0, 100);
: j' d1 S0 Q: V% {6 v1 Q - }
{6 m3 x( F% B - closesocket(sockClient); i4 t5 y' Q9 F, @, e0 B7 ]2 A O
- system("pause");' J; ~2 `/ G1 t2 g% a9 Q, D( n6 L
- return 0;
% y+ U- a# `, B: Z) G% p/ m0 p - }
复制代码 客户端代码:
# C; _8 i. H% \" c1 C5 p- #include<winsock2.h>' v. z* J/ P Z$ n7 z: V- m- F
- #include<stdio.h>
! S( u% M6 Y1 d0 y( l. b5 Z - #pragma comment(lib, "ws2_32.lib")
( ]- n6 T% F! l9 c2 t - void main()
5 C* ]7 E) M, S' C; p5 r2 v9 D - {- A6 i$ N9 [, ?% Q- B
- WSADATA wsaData;9 d! Q8 y; r8 o, Z' I( a
- SOCKET sockClient;//客户端Socket
, z( ^) z& G+ m - SOCKADDR_IN addrServer;//服务端地址: y/ z& V9 @" n9 E% z9 R4 C- L3 @
- WSAStartup(MAKEWORD(2, 2), &wsaData);" D7 z. R' A5 I; V% b; t, d' [9 [ t
- char message[20] = "HelloSocket!";
U- e5 {2 @2 G r - //定义要连接的服务端地址
E' S: J5 x) Y( _: E3 C - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
6 c, t4 f) U' S; ?4 | - addrServer.sin_family = AF_INET;
4 C1 o# z4 B; B, p1 O" K+ G, t - addrServer.sin_port = htons(6000);//连接端口6000
, s* F8 \ D2 k( N - //新建客户端socket% F! Q2 L0 [: b7 i1 X8 o; X. B$ I* L
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/ U' f/ A. d+ p- |/ P - int s = 0;
! {% n; T `' A# `- ^6 [4 [ - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
( k. ?6 T" P, W
* A8 i0 r$ _" I- while (1){8 D4 y) @( J2 x+ J; @
- //发送数据8 r* O* d1 H4 f: d5 M0 `
- int a = send(sockClient, message, strlen(message) + 1, 0);4 U+ S2 z; K- l4 i( A, @
- printf("to server:");
& L' o7 I- s/ @0 |. u- W% U - scanf("%s", message);
; W) t: ]2 z% [* @' ~9 ?$ V$ N
" t+ d8 _/ H2 f6 c- }
2 V7 L" n. J! [, `% z/ @& W - //关闭socket
; s( e1 n( u7 b3 G% {) W9 N - closesocket(sockClient);- d8 }* t3 _/ w. e
- WSACleanup();# e7 m1 Y y8 M/ w2 P
- }
复制代码 求懂的高手来解答一下。
/ z3 C4 @6 {2 {. D: q, [( K5 {# y谢谢了!
8 \4 l5 Z3 \1 q E7 q7 H$ y3 K Q5 J# z- h
# [) `( l% v/ P2 S- U% e
. ?3 @; k3 E* Q- L |
|