您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12684|回复: 2
打印 上一主题 下一主题

[C] C语言 socket 编写简单服务端客户端通信问题

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。" p7 Z2 U* ^) Y) a0 }0 [
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。' F# N1 K# ?7 y1 y
Talk is cheak , show me the code.
; Z  T  k' o$ V# N# T1 h- G服务端代码:
( u; w/ q8 v; F) M+ H3 m
  1. #include<stdlib.h>1 ~% z0 j: @# b' z+ K: q2 G
  2. #include<WinSock2.h>" X. K9 [; W2 q7 P5 y
  3. #pragma comment(lib,"ws2_32.lib")( _9 J9 s1 B( h$ C
  4. int main(){5 ]6 z- n4 |, t) b
  5.     WSADATA wsd;* |0 g/ Z3 ^6 B
  6.     SOCKET sockServer;" p7 x3 V- V, f- i' M3 W
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    # t8 i( g* E# W) {, |
  8.     SOCKET sockClient;! d, n* p  P- U9 }$ u4 [+ k% w/ ~
  9.     SOCKADDR_IN clientaddr;( d" A5 ^' @) G8 Q
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    9 _, L0 n1 S5 C% E( o3 L
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    2 y/ i# L$ Q$ a1 i0 o

  12. 4 l' E# @, f  _
  13. + R$ E% a& z$ Y0 d" [
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ! ^) U( J3 }+ }* ~4 G* F
  15.         printf("Socket has been created :%d", sockServer);! w$ D$ ]. r9 q) L* ]% p
  16.     }$ }; o) B1 Y" [6 {6 C9 s9 }
  17.     else{
    7 b3 @( P3 t7 R$ T  e. G
  18.         printf("Socket create failed.");6 y+ x9 ]8 [& h. ]+ {6 H8 f  |2 v& A
  19.         exit(0);9 |6 u" |+ d) }' [- S& E7 X
  20.     }
    : L, w7 c& w+ s8 |
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);! z* P+ [+ z! D- p5 W8 c
  22.     serveraddr.sin_family = AF_INET;
    ; ^8 n9 E2 J3 F' ~& p
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000( |4 j0 m& C1 {. F' [! ]9 |
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    0 c5 F' e# u# o+ ?: G1 i; g
  25.     char recvBuf[100];
    - {- r" _3 }5 S) m+ g! r
  26.     int len = sizeof(SOCKADDR);  t9 Z7 U; R! s  {
  27.     listen(sockServer, 5);//5为等待连接数
    * k3 U' H4 g1 J
  28.     while (1){
    1 H6 O4 H. q; _9 q: z: n
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);" {# R7 |6 S) u
  30.         //接收客户端数据
    ' c' H3 p7 j5 t
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    9 m# n% a1 D! v; O/ n/ A
  32.         printf("to me:%s\n",recvBuf);
    " R+ ?3 F' a, O$ Y8 n. f$ B8 N7 A
  33.         memset(recvBuf, 0, 100);
    * s3 d" v' u7 N4 T3 d
  34.     }
    " r+ @: t! ^9 G7 ?$ G5 H2 q; ^4 h
  35.     closesocket(sockClient);
    " w5 n( S. |+ a$ W2 ^  I
  36.     system("pause");2 s% P3 @5 M$ P2 T
  37.     return 0;- V3 W+ H0 L' j* H1 w
  38. }
复制代码
客户端代码:
2 J* [. T5 F. ~$ j' z
  1. #include<winsock2.h>
    / i4 M7 M: |+ l& V8 W0 [; G
  2. #include<stdio.h>
    ! a0 [/ g( U$ J+ ]1 E7 J) ^
  3. #pragma comment(lib, "ws2_32.lib")& c) K* o6 {9 u' m+ U
  4. void main()8 A3 F& |: z3 `+ W. z
  5. {
    / k/ f4 ]$ d# @$ j
  6.     WSADATA wsaData;
    0 G4 [5 Y1 m. |. r' O
  7.     SOCKET sockClient;//客户端Socket
    1 q9 L7 w5 P% q) _
  8.     SOCKADDR_IN addrServer;//服务端地址  E/ X8 h9 f" p4 f' e6 r
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    / {: w4 X% z* v$ Q( u
  10.     char message[20] = "HelloSocket!";
    & X* U# u6 K# O8 u2 W7 e! B
  11.     //定义要连接的服务端地址
    1 N$ C1 K2 v4 n& D; k) K$ K2 p# o
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    9 N# u( }" F1 }
  13.     addrServer.sin_family = AF_INET;* c" y5 f. J. O' H  n
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    . d% O* y$ s" `) I
  15.     //新建客户端socket1 {  S2 `& G* l3 u/ d$ ?. b% K
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; c( }( d' }; ?! J8 x; E  n& \
  17.     int s = 0;& Z3 Z' u" }3 c* ^2 {
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));# M3 }- G$ O: s7 M8 p
  19. 3 z, H" q; S( M& o8 e& [
  20.     while (1){/ r$ ~% ^* j1 F5 L2 v
  21.         //发送数据- c$ p/ F. Y2 Q2 A
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);. G1 e3 o: o3 z: G& L
  23.         printf("to server:");
    6 ]3 J0 U) c9 C  n! O& D
  24.         scanf("%s", message);
    ' p/ \, X3 Z8 X9 ^+ {7 I
  25. ) W/ L( a3 r& f! w8 n/ i
  26.     }' ~9 Z6 r' q! t8 q& e7 ]
  27.     //关闭socket
    . G1 I4 T5 w3 D6 r2 _1 J
  28.     closesocket(sockClient);
    6 {1 Y/ {2 i0 T6 }7 F
  29.     WSACleanup();
    8 w% _0 b( p4 u1 `4 K
  30. }
复制代码
求懂的高手来解答一下。
" F8 ^/ G% m9 R" p* R9 |6 U谢谢了!( z7 o) a0 h. F  R) f3 C

5 e  u6 K, {* v3 G: B/ N0 @8 W3 C# z/ M) Z$ m$ O
1 K4 o7 j9 O4 Z0 D  g: w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
* p5 |% Z- Y1 q* n  orecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 00:58 , Processed in 0.120428 second(s), 19 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!