管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
( W- H7 w# K4 A8 T' n; G- v* C我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。. c! d5 c+ w1 l) ~' `0 w8 T
Talk is cheak , show me the code.
! A9 `7 k; @3 B( e% C- f服务端代码:
- N1 M1 L1 F. ?7 a- #include<stdlib.h>
* } \& l* A; w ?7 ]. v1 N' q - #include<WinSock2.h>2 W& W% l2 Q5 f6 {2 F
- #pragma comment(lib,"ws2_32.lib")
! s3 W1 p: a# i. x* M; S - int main(){1 U7 G# `- S% z7 r1 Y
- WSADATA wsd;5 V0 \/ T+ e5 N: O N8 R4 E
- SOCKET sockServer;
' ~0 P9 u0 _3 j* e4 Q" A - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号0 F q3 ?4 [( K: G
- SOCKET sockClient;
; `4 k# j# L" V - SOCKADDR_IN clientaddr;8 X8 P1 g8 E0 d& Z$ J/ Z+ ~: Z
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
- P. U! s& t+ p) n: l7 ?6 t - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
( V/ b9 I; T1 |& S+ V
% U9 Y3 ]0 y) z) }
1 t( V: D4 j6 ?8 \- if (sockServer != -1 && sockServer != INVALID_SOCKET){
0 k+ v q( q7 n6 \ x9 i+ G4 y - printf("Socket has been created :%d", sockServer);" K* s4 Z" [2 ~) m6 g0 h. \
- }; M, s& x/ D; [1 O* L: H& ?+ Q6 K
- else{
% l( q6 Q: w( l# H - printf("Socket create failed.");
3 s. q7 T0 x8 [* ^ - exit(0);/ X3 B% P+ R1 J9 z3 \
- }
2 r O3 @8 {0 Y/ T7 Y - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
" V# i: b# K: G! z0 C - serveraddr.sin_family = AF_INET;2 ^2 c# c o8 Q1 B5 }) S
- serveraddr.sin_port = htons(6000);//绑定端口6000
& s0 I$ @# u, ` e - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));$ g9 P$ u0 u. X- q7 j
- char recvBuf[100];$ l% n: n! J; V( {
- int len = sizeof(SOCKADDR);
g2 t, B9 u+ ` - listen(sockServer, 5);//5为等待连接数8 V( ^- H" P- Z& P" n
- while (1){
& e0 p: r" k D" h( n - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);; u I5 E& V- s2 @/ [
- //接收客户端数据
. K: L% c: x5 G% }6 F) `1 | - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);: H8 l+ ^4 K1 ~/ L- N$ t
- printf("to me:%s\n",recvBuf);
* |: `4 y& U% ^$ ~6 ^ S% D4 n - memset(recvBuf, 0, 100);$ V4 c1 y1 D3 B/ e q
- }
( ]+ D. g& p. P0 r1 c \! L - closesocket(sockClient);
! j/ m: q) J6 e. f$ w - system("pause"); `9 u* b8 w" ~( s6 F3 s! `, ]
- return 0;, d+ d0 F/ H0 z
- }
复制代码 客户端代码:: z3 u1 f! V4 Y" L* j
- #include<winsock2.h>. ~7 [4 n, I$ h1 C* `
- #include<stdio.h>
5 j6 M) }& a D" Q+ f% a - #pragma comment(lib, "ws2_32.lib")
9 w3 k! t4 C+ i; ^7 d - void main()
. w7 I4 u9 p* @4 [+ l. g j - {4 q! j) q3 Y; x P7 Q j
- WSADATA wsaData;0 q8 [; b7 b2 U
- SOCKET sockClient;//客户端Socket
0 d5 l9 o( P1 @5 A* W6 Z" X - SOCKADDR_IN addrServer;//服务端地址
, z& f/ I0 {+ S - WSAStartup(MAKEWORD(2, 2), &wsaData);# |' n2 [, U0 h* K# q! t
- char message[20] = "HelloSocket!";
$ s* E$ @8 a2 j2 M. A! r3 z - //定义要连接的服务端地址. G( N- \: M6 R% L+ H3 H
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
6 Y8 q( a, z( k# A1 ]- J - addrServer.sin_family = AF_INET;
/ Y0 l: f( y) d& Z - addrServer.sin_port = htons(6000);//连接端口6000
( o. ?9 C% u- \& K7 } - //新建客户端socket
# d7 S$ z8 d& Y- `$ R3 v6 O - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
, {7 Q2 p1 D- D8 p7 p% J8 F" W! d* B - int s = 0;
8 ?' V: [0 O1 ?0 o t - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
6 k8 P5 x, ^: n8 V+ S
: Z: c6 K9 Q% p) L- while (1){
# G0 X- `8 d) h$ f J6 l - //发送数据
( J+ S) H0 I2 B+ |. u* k1 } - int a = send(sockClient, message, strlen(message) + 1, 0);1 }1 d! G+ _2 Y S* V: | M4 Z
- printf("to server:");
a* [2 r: I8 ]! N - scanf("%s", message);
- `1 r) o. }: S1 Z3 {
0 W8 S, ~, c) D0 z- F& z ?% v- }
5 W4 a* y: e2 \8 e4 P - //关闭socket
, \, R; D5 ]. Y; N# l$ J; s2 | - closesocket(sockClient);3 f3 P; N% M! o* f, `( R$ h
- WSACleanup();
Z% v. V: W& q, Z* R - }
复制代码 求懂的高手来解答一下。7 m- k( a7 ]4 ?3 U0 k5 e
谢谢了!
. }; J, d2 j" K z0 g
/ h" V) I1 _ Y7 N# ]; E9 E: m) j5 B; X8 C: F6 \
0 q+ G1 W: }" x. I9 {7 @8 N; E
|
|