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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。5 ^3 r' r6 {' p* P# o4 z
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。9 `2 F5 _7 S& s* |4 U  `; O. s/ h
Talk is cheak , show me the code.
5 x) M  N5 X* A- @5 _# @$ j服务端代码:& @* N- [5 w# I& G0 S
  1. #include<stdlib.h>
    7 }2 y3 h8 c' e3 P  k' ?8 n) V
  2. #include<WinSock2.h>
    * f8 ^4 u2 E! k+ C
  3. #pragma comment(lib,"ws2_32.lib")
    " F3 C, J" h9 X9 V2 y
  4. int main(){' y1 F9 Z0 u. F
  5.     WSADATA wsd;
    ) d3 n% P! q2 P
  6.     SOCKET sockServer;
    1 \, a2 ?( y6 C5 r  K% L
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    4 W# j2 I& [1 Y+ V, h
  8.     SOCKET sockClient;9 ^3 `* V$ I0 P/ \( S6 _: g5 H
  9.     SOCKADDR_IN clientaddr;
    ( e, K/ a4 M9 H4 u$ F
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    8 U$ \' H+ A0 g$ ]' O! Z$ a
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    6 B! M9 m, K' [1 k; n( K" P5 K( v
  12. 0 @( d1 V! I! o; f1 i" [

  13. 7 e: \% ?6 @, s0 ^
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){7 M0 T% N$ [/ {
  15.         printf("Socket has been created :%d", sockServer);
    ; f% G: ^; U# h( g; a1 ^. f
  16.     }
    / v1 A9 ?! U4 t
  17.     else{$ N" f8 D. u/ ]8 n; f" T
  18.         printf("Socket create failed.");& C' e& B9 |; v5 |) a6 |' W0 ~/ p8 ?* f
  19.         exit(0);
    4 D" f; T0 {9 ~  Z# D
  20.     }% K' w6 n! u: }5 ?
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);; l" q. ~, s* T  E! ?& }# G
  22.     serveraddr.sin_family = AF_INET;$ N7 _7 j" U3 \
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000- w2 [1 P) z/ c, p
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    0 c! \# {# w4 ]( \+ I, H" N: n
  25.     char recvBuf[100];+ Z; B  Q( n6 m4 u
  26.     int len = sizeof(SOCKADDR);
    & Y' p6 p4 z  F; G
  27.     listen(sockServer, 5);//5为等待连接数
    9 Y# [3 W' f# }* \$ t
  28.     while (1){9 F6 ^; Z2 N  `1 s
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    1 Z7 ?& x) w5 e4 c8 Q
  30.         //接收客户端数据- s) `1 z- K5 R' Y6 w$ Q
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);% f0 c' ]8 F5 r6 ]2 G! P6 l5 U
  32.         printf("to me:%s\n",recvBuf);+ V$ C8 g" G& r: z. {
  33.         memset(recvBuf, 0, 100);
    + T( y" ?- h  X" p" I
  34.     }
    4 Q: t" q9 |. v8 m0 D0 z! ^
  35.     closesocket(sockClient);
    0 l* P' {" _" X5 r% P2 \- C
  36.     system("pause");
    % _4 V% ~: E- y
  37.     return 0;
    . r5 m9 ~% t) m' F% ]
  38. }
复制代码
客户端代码:& o9 Z* Z9 |& L+ P. s3 Y" a0 I! L* V
  1. #include<winsock2.h>
    0 G+ C, N. @' l5 h+ m7 I$ |' b4 a
  2. #include<stdio.h>
    1 D) J8 J' n: c5 j
  3. #pragma comment(lib, "ws2_32.lib")
    . v4 D) _5 W- U% q; G
  4. void main()
    , D( B* A  m5 M2 {6 c, }
  5. {
    " i2 s( }) W2 a2 ~
  6.     WSADATA wsaData;* e! r4 }* A) c4 Q" G) H9 O/ P; o9 U
  7.     SOCKET sockClient;//客户端Socket: v2 e" _' P/ M
  8.     SOCKADDR_IN addrServer;//服务端地址
    % N# x6 l& b% P. O6 V9 @
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);$ x/ h% [0 O& v
  10.     char message[20] = "HelloSocket!";
    / K" w, K. W' l, h( v% |8 Y5 t& e
  11.     //定义要连接的服务端地址
    6 U( a6 P7 ?; w* t9 K! C
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)" C% l5 v9 G& Y2 ~: O" U# w
  13.     addrServer.sin_family = AF_INET;
    8 ?. H+ h8 O) Z5 `1 `
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    2 g5 A0 I  @- M3 H1 \. @
  15.     //新建客户端socket
    - l# g# `" Y4 t" Z& |5 }
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);% W, C" t; c; y6 g) H- A- r9 n. i# r
  17.     int s = 0;
    7 u* R2 p4 G. j, W) u
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    . j# _8 F! V) q6 o9 e2 ~( e
  19. / b( k7 `5 {" W0 m% Y
  20.     while (1){
    ; Y( S/ A: n8 @" }3 ]6 {- `
  21.         //发送数据
    ( \0 b0 d8 p; C
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    - n- K: u) C$ h* `+ T3 D. H
  23.         printf("to server:");/ s* M+ T. d) i# E% U
  24.         scanf("%s", message);
    ( B; J  k% D0 v  {7 X
  25. 3 ~  s7 c* p; |" Z; Z# H# e8 g
  26.     }
    7 }4 O. ~1 f; p
  27.     //关闭socket! y3 T. {" w1 f2 m) \. T6 c
  28.     closesocket(sockClient);
    6 m/ g' P3 s6 {0 I: u. i
  29.     WSACleanup();
    , b) m2 _  S% l
  30. }
复制代码
求懂的高手来解答一下。% N, j: Q# Q  u' L
谢谢了!: J3 |1 g  X( X1 L  Y  |1 q! s0 q

& U' c  j3 p; `- o4 M3 U5 w6 p, [( V4 U+ m5 G2 e. [* ~; \: T
2 H' v' a! ?, i% W) K7 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
! o) I0 [- Q6 |' F9 S* Qrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-4 10:48 , Processed in 0.055334 second(s), 20 queries .

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