cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
, }3 c5 {) Y" t3 z3 d
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
. _7 Q- l7 g1 W% ?6 @$ t
Talk is cheak , show me the code.
6 R( ~, a& ?( {
服务端代码:
" o( U8 W8 j6 I) i9 O b& `7 ~
#include<stdlib.h>
9 N" W" {1 i% N: Z @! U1 k- w
#include<WinSock2.h>
" \0 V, J2 p; n0 [! l' n) v3 h d
#pragma comment(lib,"ws2_32.lib")
% L ?7 |, E, l9 k. I
int main(){
7 G$ i @8 x; P' c$ E
WSADATA wsd;
* F8 S% ^& ^8 P o. S
SOCKET sockServer;
7 m k# H! A0 X
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
: ^2 e' _0 j6 N5 v
SOCKET sockClient;
* G7 |+ L2 a8 K" G
SOCKADDR_IN clientaddr;
( h d; X/ Z; ]
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
7 ?+ M% W% }0 [; r
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
3 ^5 u6 d' y3 t( W+ m
2 E# W( b4 U3 Z. W Y s2 p# g* H. \ G; ^
+ p2 `( ^# D X l' @
if (sockServer != -1 && sockServer != INVALID_SOCKET){
" r. v" r6 s9 I5 R7 }# y5 {
printf("Socket has been created :%d", sockServer);
% B5 L$ `* }0 n
}
3 z7 T# y9 j" s$ i5 i0 Y0 F4 U
else{
; {: ~7 J# C N2 P h* R& @
printf("Socket create failed.");
/ l& F o% m, e8 L# ^) `1 w
exit(0);
9 f- @# j$ ^- ~! y/ J9 [$ S
}
+ M( v4 L9 J; q8 t
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
) S s4 `7 j1 Z( D h
serveraddr.sin_family = AF_INET;
, N' F' f+ r7 a0 v
serveraddr.sin_port = htons(6000);//绑定端口6000
. G. l$ a! L+ I5 ]" t- x
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
4 x7 X% n' D; y
char recvBuf[100];
$ ~( @0 q8 ?0 x% V; B9 W/ z" B
int len = sizeof(SOCKADDR);
- B" @- a" }9 K- t8 f
listen(sockServer, 5);//5为等待连接数
K, X0 f6 s/ g5 n
while (1){
$ L7 C4 r+ R. z: b; L* E
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
, U+ F+ _; K8 w8 j. O; F
//接收客户端数据
9 Y1 G# [; l& e- w- u0 M
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
! H) ]. | O& r% h- T4 q
printf("to me:%s\n",recvBuf);
. F y7 U; u/ H/ I
memset(recvBuf, 0, 100);
; [; N" V4 ~$ }* w/ o
}
6 R! B1 @5 U1 }+ A' \0 S8 R6 W
closesocket(sockClient);
/ m+ j7 x; I8 P: p- E
system("pause");
4 i# R- q. W+ q4 L, U( Z
return 0;
- D2 S2 w8 T z9 Q3 B2 m: Z
}
复制代码
客户端代码:
" Z9 U0 L3 F3 m9 f' Z
#include<winsock2.h>
4 [ O* g& Q" [. i) ~" Q
#include<stdio.h>
& L% b4 t+ \( C+ m+ H
#pragma comment(lib, "ws2_32.lib")
% t t! k* ~. g0 y
void main()
3 Y0 I- }; P# P5 f/ A
{
% J) P/ A5 w m8 G; L6 v% Q6 Q
WSADATA wsaData;
3 O- \ F0 k' L
SOCKET sockClient;//客户端Socket
$ j; r+ e p* e& D* g4 ?- \
SOCKADDR_IN addrServer;//服务端地址
+ P7 j; r. J2 v3 t- W# z& t
WSAStartup(MAKEWORD(2, 2), &wsaData);
. ^ n8 V. S& e! i C" p @$ g
char message[20] = "HelloSocket!";
( N9 u" Z2 y7 n# v
//定义要连接的服务端地址
7 \) j7 [' q# t! ~" H( i: J v' M y
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
0 L V( t/ Q6 F1 k* l9 k
addrServer.sin_family = AF_INET;
5 e) ~( w* A( q/ y
addrServer.sin_port = htons(6000);//连接端口6000
, i; w5 g% Z% I8 v+ ^ ?
//新建客户端socket
4 w( {3 c, G5 p; X7 ^5 J
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
. Q: s( y$ D! M
int s = 0;
* u3 H. @4 G3 E
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
h) I3 ]' x" u' ?! I5 O
V, y4 C4 L& s* ~! N
while (1){
5 u7 `. ?) {& [6 d
//发送数据
$ w& _$ V' u* y3 ]. M) o F1 n% [
int a = send(sockClient, message, strlen(message) + 1, 0);
/ o, g; D5 @6 Q8 F* k/ e: A2 [
printf("to server:");
. Z2 {# w) l+ @- P! }2 C8 {: p
scanf("%s", message);
5 N. N0 c2 z/ J9 a+ \" C
. m7 m/ D# Z# m" ]. X
}
! _ x; u* u$ U0 T& p# ]3 t
//关闭socket
# ?9 V6 f1 ?1 u8 i; m1 ]
closesocket(sockClient);
4 L9 n, b. h# G, M8 q: q+ u" H$ L
WSACleanup();
6 G k6 T- X3 D! c2 [3 {* u' X! ?' |
}
复制代码
求懂的高手来解答一下。
! o8 n3 Q o) F
谢谢了!
/ l# M7 i$ ~: B2 B4 P6 ]
7 c a& ?$ T( B" o
, w! }8 }# p/ b8 G
: O" r! r# i# @# q( f, Q8 c) d
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
$ N9 ?( ~! i' ]" j% K
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2