cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
" X4 _! I8 b! k* G. }& P
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 b' N3 R3 Z) {- l; `* |0 _% z
Talk is cheak , show me the code.
* ]( p9 \7 I) w
服务端代码:
* C. L( _6 u7 p6 f( P3 x- M( K
#include<stdlib.h>
& K% A9 ^0 Y7 k! l8 ?5 ^0 a
#include<WinSock2.h>
* }* Q" |! Q' ?' w& K. T" R
#pragma comment(lib,"ws2_32.lib")
1 P" w1 z1 ]. u. ~3 H
int main(){
, Y$ K K* k2 M( ]9 o0 h
WSADATA wsd;
, I- j* v8 O0 `
SOCKET sockServer;
; {; i; _$ w `
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
2 _6 _9 h; _3 O
SOCKET sockClient;
& z" [) X6 w/ }1 e
SOCKADDR_IN clientaddr;
( X4 w' v9 g( F/ _6 F0 b7 |7 ^( P5 b
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
; ^: g. V" `/ l" z
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
; S, n; c( t$ {1 M
; |* F) K! m' C: d, t; ^! z
" \) Z9 u- N [3 s4 R7 \0 y' [5 X Y
if (sockServer != -1 && sockServer != INVALID_SOCKET){
* t. f7 j; z3 V- D6 `
printf("Socket has been created :%d", sockServer);
* c0 i$ |0 `, f4 B" i6 Y) Q6 Y
}
6 m+ M6 R8 @/ i5 W! z' J
else{
) r5 w. s2 \/ c" I# h
printf("Socket create failed.");
K$ L Y1 V0 c8 F" F
exit(0);
+ J* S2 x! k8 U6 S; X3 `
}
$ v% }2 R5 m1 R/ Y3 }
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- ]0 \1 Q& M! s
serveraddr.sin_family = AF_INET;
9 n. G: l- W& M
serveraddr.sin_port = htons(6000);//绑定端口6000
2 S8 ~: u+ E1 k. G
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
/ H4 C" I% y' Z* E1 A+ C0 m: H
char recvBuf[100];
) h/ h3 r7 v' i- N
int len = sizeof(SOCKADDR);
/ G5 ?! A3 z2 ?! _7 s
listen(sockServer, 5);//5为等待连接数
7 L8 r* P9 V& P B7 r
while (1){
- s1 P$ a, A! {5 S4 j
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
" W- Q- [5 B* l
//接收客户端数据
7 U# r% D, K3 J( ]
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
$ c9 @$ Z# P, N2 ~# ~
printf("to me:%s\n",recvBuf);
6 z: p& k5 b5 }5 {+ ~( j' [( V9 L) K
memset(recvBuf, 0, 100);
& U! a( T& ~& n# g" g
}
8 t7 ~3 Z) z; k/ f( v6 M
closesocket(sockClient);
/ _/ E* s# Z: R
system("pause");
. E s" p8 A6 h* F
return 0;
0 g% r I3 c' |3 \( r' W
}
复制代码
客户端代码:
3 }" j2 n8 `% V) E/ B) Z, @% v7 z8 z
#include<winsock2.h>
6 T& h: ?, s) V8 j
#include<stdio.h>
- |6 a9 o) k, e, ?, }* A- G' `
#pragma comment(lib, "ws2_32.lib")
% G3 }* v6 _7 N3 N' R
void main()
2 l3 p$ p( j0 V/ e$ B
{
6 H# @! V! t3 n. l
WSADATA wsaData;
2 ?% L, U1 L" j& |0 S/ t
SOCKET sockClient;//客户端Socket
! H2 d' a) v1 ~" x4 U$ j9 `; g
SOCKADDR_IN addrServer;//服务端地址
7 u+ M% q& F' T8 m4 ^# v
WSAStartup(MAKEWORD(2, 2), &wsaData);
8 o5 x! o. I. U, M( a% _
char message[20] = "HelloSocket!";
8 w- J3 H4 X) n6 V/ C
//定义要连接的服务端地址
$ p# F, \8 g! v2 Z
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
p! s; i* E: \5 q# k w
addrServer.sin_family = AF_INET;
. m# F4 @& N7 M0 o0 b+ ~8 o! s
addrServer.sin_port = htons(6000);//连接端口6000
$ C- x( x2 v1 \; j6 L3 t
//新建客户端socket
0 a- V( v2 T& P0 ]* x
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- F/ H Z* N( p5 ~+ \
int s = 0;
0 U+ s; ?( C: T
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
) O- `% p" @8 v+ ]% \) N$ n
9 \$ l( k) T3 w7 J
while (1){
$ R6 \' ?) S& F! L
//发送数据
# b. y& b' n3 d5 g' G) w
int a = send(sockClient, message, strlen(message) + 1, 0);
( b) I( N2 x4 N- m
printf("to server:");
2 d7 z1 O$ B- M/ `# u/ ]8 K
scanf("%s", message);
# a) m1 U( o( @
% d( V/ f5 A1 G
}
1 Q, K5 C2 ~0 b- u
//关闭socket
8 E1 \& Z( c9 Y% Z' i3 l7 m% C
closesocket(sockClient);
$ A$ u% J6 @: O- C6 Z" }$ C
WSACleanup();
: o! O2 b( p. x" i; a9 w
}
复制代码
求懂的高手来解答一下。
+ F- u' Y% e4 x
谢谢了!
. p& `+ c3 p( K9 j0 g
8 O: g: R5 h7 ?; r/ {3 g
% ^4 D1 Y" n) N" d, t
6 i# y/ k! c/ g' V8 U- D
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
7 h/ Y1 _' r& S
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2