cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
. r x, r4 c6 z8 V" w
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
: r) L# P; c1 S" e2 ^) ^8 J* U
Talk is cheak , show me the code.
6 w6 _, R3 c, x- ]3 N
服务端代码:
) K$ g8 }& C7 `2 }
#include<stdlib.h>
' W( P y# \1 r: }' e1 g
#include<WinSock2.h>
?' M" H1 P7 c: I4 s
#pragma comment(lib,"ws2_32.lib")
0 j6 m8 a F" k. Q# e
int main(){
( z2 d. r& `0 ~9 f$ x/ G" J
WSADATA wsd;
. C( ]: n. S7 T" C
SOCKET sockServer;
9 s% } X; K1 ?& g! u3 j" ]
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
5 p2 F/ n9 ] I! G( [; C% E1 @
SOCKET sockClient;
/ ~# p/ J; i- S+ `1 c6 ]
SOCKADDR_IN clientaddr;
7 w: s! b- C5 K+ n! Y, d; a, g/ B
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
2 I6 d- n' c- C$ c e* C
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
2 j+ e* N$ q( Q- J6 _
+ w k f, p; z( f7 B
9 J# ~/ p+ y1 U- ? Z
if (sockServer != -1 && sockServer != INVALID_SOCKET){
: Z# c" Y- O9 b- r& L
printf("Socket has been created :%d", sockServer);
# K0 u% j& K6 r, b' ~6 P
}
* d, |! E4 ]3 G
else{
' [: y" t `4 }+ T/ _
printf("Socket create failed.");
3 J4 `4 L+ o% o2 ]" X; k
exit(0);
% \ r' G9 r+ d/ w( _6 Y; `5 b1 h
}
8 l5 e2 U! y0 X3 n6 k
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
" V; p, ?$ F* j
serveraddr.sin_family = AF_INET;
, n* l9 v w7 w* a- m
serveraddr.sin_port = htons(6000);//绑定端口6000
0 A1 q I2 b" ?0 S# L
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
6 {4 m9 b" Y5 Z! _
char recvBuf[100];
) k2 i. l" A( M" S6 y9 K2 F
int len = sizeof(SOCKADDR);
+ p2 C7 H' Z' Z* ~
listen(sockServer, 5);//5为等待连接数
/ w5 J7 l0 S. j3 K( L" p
while (1){
: R% _8 a# W$ C
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
: [# Q \& S( }2 J. V- r# O
//接收客户端数据
$ X# m3 X3 j) {# ?$ A% u/ O
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
5 H0 ?) L) P# a1 v
printf("to me:%s\n",recvBuf);
# ?, i3 J/ ]! r2 X, q# E7 e! i
memset(recvBuf, 0, 100);
' v A3 l3 o/ G6 f" I) S
}
' w3 k. M. @5 u0 D I" w* [, H
closesocket(sockClient);
+ m: s' P% R3 b9 s
system("pause");
2 C2 i7 D! M% B1 L" k& X) ]; h" R
return 0;
" ~5 }' {+ i: g, d, D
}
复制代码
客户端代码:
3 h. K% ~+ i' d J# z# R [
#include<winsock2.h>
- n7 D" f! U; O3 i
#include<stdio.h>
3 t7 e2 W$ T6 u( s$ G+ Y
#pragma comment(lib, "ws2_32.lib")
0 {% S5 m- V' s4 e
void main()
1 g1 @9 a% }/ X$ i
{
+ ^8 G$ [* X; v$ v$ P
WSADATA wsaData;
& k5 m% E3 m1 L C w' k
SOCKET sockClient;//客户端Socket
! M" d8 O0 C M
SOCKADDR_IN addrServer;//服务端地址
# y9 u0 T7 ?+ C! ]8 e2 S
WSAStartup(MAKEWORD(2, 2), &wsaData);
* k2 n! E$ ]7 m# q6 T
char message[20] = "HelloSocket!";
+ V( `' Y& `/ h+ y% w1 w2 s0 ?7 M
//定义要连接的服务端地址
' U6 a ?) i: T. a1 i; T/ |/ g( s
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
1 X' a- R6 K8 F# Z% E' L2 |3 B
addrServer.sin_family = AF_INET;
2 c5 M, ~* u1 [, p( W8 t+ u7 {
addrServer.sin_port = htons(6000);//连接端口6000
, u4 v# b1 C% I) E4 [& S
//新建客户端socket
" I6 d. |9 Z2 L0 }, v) S
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
! n. _8 |. ?0 Z+ T
int s = 0;
: T1 t1 D5 V6 v
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
) g" T1 ~+ c! R2 X
& G8 O, Q- H# W; C& n" q. R
while (1){
. T2 C* l, n+ s7 n" i: ^9 N9 _
//发送数据
9 L5 g# _# l7 b. Y$ R- E' X% Q
int a = send(sockClient, message, strlen(message) + 1, 0);
2 p+ N A# H7 Y) w; `
printf("to server:");
& D1 f" J/ Y: O; {- z3 x: y7 ^
scanf("%s", message);
; }) m8 k0 d5 p+ P) `. n9 i% ?
- G0 }& q; P- B# v
}
+ u& e: e2 \+ k% a& x% u% c$ e* j$ g
//关闭socket
- P5 r" B- m K# D% Y0 p' m
closesocket(sockClient);
7 u. T9 R& P ]5 K9 p" ]9 }
WSACleanup();
1 U1 H4 {2 d' I) _1 J0 z" R" d
}
复制代码
求懂的高手来解答一下。
0 _: M Y3 H/ A+ _5 R/ s' D# I3 l
谢谢了!
' D3 S( f' F8 w' }
' C; r/ y, }4 W% T9 i& S
4 u9 L- |* q0 t
# n# m8 U! v9 ~5 i: Q" a: I0 F0 @
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
* E) h9 f( L2 |$ P: p: g' S# Y I
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2