cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
/ i* p9 G4 q5 m
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
% h9 Z" r1 I7 O7 q, B) F8 y
Talk is cheak , show me the code.
1 ~9 p) d) K0 q* o! b
服务端代码:
+ N5 y3 c( \6 `1 K: _/ p7 m( s7 Q
#include<stdlib.h>
9 _! ~' p2 V0 @8 o5 f' q/ S8 X
#include<WinSock2.h>
* T7 ^* G* o& Z9 a1 m' p
#pragma comment(lib,"ws2_32.lib")
% \' |) [6 R+ J" D
int main(){
# V3 S" S+ p$ a4 [# ~! G
WSADATA wsd;
g0 d) H" k: i/ w, D9 Y, R6 T
SOCKET sockServer;
. N7 t+ T+ s8 s8 F5 A3 i$ ~6 f
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
9 N5 ~1 p7 e+ P6 i
SOCKET sockClient;
8 F' g$ i% C3 k0 l5 z
SOCKADDR_IN clientaddr;
: ~) r- f" l" {9 H9 l
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
2 }/ l0 j g! o* Y. V# [& ?
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
1 a" t( M* h( a0 B' U4 h' |
) x. T% l) ~9 i! I C z
# T* c: Y6 G& r: H0 Q) F# D
if (sockServer != -1 && sockServer != INVALID_SOCKET){
4 ]3 y$ g! m, R/ Z# a# q
printf("Socket has been created :%d", sockServer);
: ?3 I1 \" @; [. @ m2 @
}
, E' X( U K% R7 Z/ T3 V3 ?; \
else{
0 U6 {" _: ~' l |+ `: o. t+ ]
printf("Socket create failed.");
4 t: ?5 v6 k9 i& u1 S' a$ i$ ?$ e% ~
exit(0);
# G3 D8 _+ S8 M3 h7 h) y& ?3 X
}
# `4 ?5 b! q* \- ~& ^' k5 Y
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
$ z7 Q6 t) O) [5 E
serveraddr.sin_family = AF_INET;
L0 |, j0 i( ?* v+ M" e3 X
serveraddr.sin_port = htons(6000);//绑定端口6000
( ]0 J% {! ~3 D, J
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
: G8 A/ s: ]: e# ?0 [) J9 F
char recvBuf[100];
8 n) I' _9 T$ q) n1 S
int len = sizeof(SOCKADDR);
6 H( u3 F$ w% S: t
listen(sockServer, 5);//5为等待连接数
$ p( T) R+ B/ x! O
while (1){
' p, p+ F& }8 {+ _
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
0 `7 N3 W+ d; D1 V
//接收客户端数据
5 q- D$ L4 }3 W" B y
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
4 I( T, B3 g4 g0 T$ M' [
printf("to me:%s\n",recvBuf);
5 g( G- f3 x0 w h4 P( h( T" o
memset(recvBuf, 0, 100);
6 B+ b& |/ Y* c. L4 ?* ?
}
: w9 T" V" x' l3 ]1 D! p% ?+ p
closesocket(sockClient);
' a# @# J. X9 V* e/ `
system("pause");
' W; v6 f% A8 V0 N$ {1 E
return 0;
# W9 D u9 Q) |/ T7 F
}
复制代码
客户端代码:
( T5 }/ n/ G3 f8 B. m$ G( g. H
#include<winsock2.h>
1 ~& Y, q. u1 K' }7 ]1 t
#include<stdio.h>
. T" Q2 s) r' @5 a: F* j9 s0 ~
#pragma comment(lib, "ws2_32.lib")
7 A/ f9 X8 S ^# P' u A
void main()
$ b& a) u8 s% r+ ^& {
{
2 b1 R# O: H1 y9 H& G, [* f/ \+ S
WSADATA wsaData;
3 e% z M+ R+ i3 X
SOCKET sockClient;//客户端Socket
t4 }7 t1 g: F/ \
SOCKADDR_IN addrServer;//服务端地址
0 |+ r( _( L' F0 D* T6 [
WSAStartup(MAKEWORD(2, 2), &wsaData);
$ |4 m2 ?# u" r, p: Z2 ]
char message[20] = "HelloSocket!";
9 J3 }# B" ?# i: i8 @- d9 P
//定义要连接的服务端地址
8 e0 n, h* P- `/ D
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
4 a9 X, W1 b. B$ Q. w; s
addrServer.sin_family = AF_INET;
, G( ]# R; R" m- [. o# L8 p
addrServer.sin_port = htons(6000);//连接端口6000
4 g) J6 [0 e5 \6 ]3 r6 ?
//新建客户端socket
0 u. m8 i( w: _8 W- G" |
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
& {+ X% \& r' w( j
int s = 0;
' W) M9 O. U' I7 g
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
/ P2 T0 v, v: s" s0 ?9 I Q: K' _: T- \
9 L+ p9 M, Q- W8 B: X( L' _
while (1){
C- p+ P q% T$ C7 t
//发送数据
; Y! F+ o+ O9 n' s; [
int a = send(sockClient, message, strlen(message) + 1, 0);
- y2 K7 J% v- c
printf("to server:");
, R& `4 n7 a9 E1 {4 h9 F- U* c; ?% \* C
scanf("%s", message);
* u( E. Q; B+ F3 T. n2 h5 x' ]* J
; r0 q* G! \9 S( O5 B5 V
}
( P) u. ?! Y: L* B/ U- s1 a
//关闭socket
# _6 r% T" Z( T& D. v
closesocket(sockClient);
. ~$ N8 n% z2 A* G; f
WSACleanup();
, ^& J, f$ n5 _3 P( Q
}
复制代码
求懂的高手来解答一下。
8 b' ]' I4 B3 o) K( C5 |
谢谢了!
3 o d& y3 t% Z- D e
7 i8 ?" [( N1 F
' x5 d- _3 X$ v
$ Q2 `1 { i ^6 t, t" e
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
/ N7 T( V2 K* k$ a4 Q+ c g; k
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2