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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。
# O1 ]4 S$ j6 I7 ~  P1 U+ d+ q# A# h我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。2 u% N; B3 R* F
Talk is cheak , show me the code.
: [# {& U- O: U' o, _服务端代码:. G( m- O: O0 z
  1. #include<stdlib.h># }/ E, M7 @( b
  2. #include<WinSock2.h>
    2 s( \- V8 I$ ]# ]1 F) f0 y$ c6 @
  3. #pragma comment(lib,"ws2_32.lib")5 ?2 U- ~) b6 R/ \- ?' s
  4. int main(){
    ) b* ]) Z4 W/ x8 \
  5.     WSADATA wsd;
    / V9 B- i- Q, S4 U7 E3 p; J
  6.     SOCKET sockServer;
    : }- f" C3 V( |; ?! n3 v, K' k& v
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号9 a9 F- R/ j4 _; L  K& z
  8.     SOCKET sockClient;
    * c0 Y! P9 i; R6 J6 i: E, j: n! s$ A! c
  9.     SOCKADDR_IN clientaddr;) q% ]& F- F$ G
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* I0 p. D9 J( }: E* p5 M% i7 r3 b, H7 C
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket$ G6 I2 [  ?8 k8 J% c% d: w2 ^8 V  d: V
  12. 1 @7 \# h: E  ]& L  r

  13. + B5 q& x# Q2 @7 u4 ^0 |; l
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){# O: e! D5 J; t+ E/ S6 v9 O4 p
  15.         printf("Socket has been created :%d", sockServer);
    ; }5 K" n; E7 U4 U" Q8 m
  16.     }
    * g. _% h1 `8 h+ D' S4 v  w
  17.     else{
    9 V4 Z% q2 U4 b" K- {' ~* D3 b
  18.         printf("Socket create failed.");9 @" i3 Z- R. a8 o# s
  19.         exit(0);
    % M( t% W' H2 p" e$ w* b+ E) o* @( L
  20.     }
    ( D! s$ l/ J5 H* @3 m5 R
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    2 B$ i5 b5 k8 v/ z
  22.     serveraddr.sin_family = AF_INET;' V+ q" {! @) h6 g" g" n/ B  @
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    * ^: D: [! \! J2 n' |: Z
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    . X; i, B3 ?3 a. ]. I
  25.     char recvBuf[100];
    % y7 z9 l5 y; U6 x/ R% p8 D
  26.     int len = sizeof(SOCKADDR);% C/ V+ H" c5 ]
  27.     listen(sockServer, 5);//5为等待连接数
    0 H  N" p8 s( R: k
  28.     while (1){" ]$ @- {! g. z. u& {
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);6 y8 l. V9 u9 I7 G" c' V0 q8 w
  30.         //接收客户端数据
    8 a/ X6 N6 }, N8 {1 U* V9 S5 ~; O
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    * p% \& n- |; P6 c
  32.         printf("to me:%s\n",recvBuf);3 x3 f3 C; E8 e3 d0 ^+ B
  33.         memset(recvBuf, 0, 100);* }( A5 h1 G  E0 Z6 J" j( G
  34.     }
    : a7 u0 r/ I# z
  35.     closesocket(sockClient);$ y5 g; H5 R0 K4 v$ N" k
  36.     system("pause");* n  q+ w9 R+ V' w0 k; \
  37.     return 0;
    / z7 ]4 s$ R( i' R4 f0 [. r! K
  38. }
复制代码
客户端代码:5 H4 [" z7 F2 R, t7 ?0 \3 D
  1. #include<winsock2.h>
    7 }# e% E, u4 H4 K$ L: t0 `
  2. #include<stdio.h>
    0 q+ g# O  V8 Y+ ]6 l: V6 r
  3. #pragma comment(lib, "ws2_32.lib")8 T( j4 x, Y' {+ a
  4. void main()6 J* T8 I0 `, \( f. J  F. @% x( ]
  5. {
    & O# Y+ q( e- t  N, T: Q: w$ ]
  6.     WSADATA wsaData;
    7 h# b. n7 R+ Y) b
  7.     SOCKET sockClient;//客户端Socket) i" q* k5 m# E
  8.     SOCKADDR_IN addrServer;//服务端地址
    + ]! U  j  `3 k' F* |
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);, w7 C" Y0 K# K* E
  10.     char message[20] = "HelloSocket!";
    ! f6 R* _* n: W# B% i/ p
  11.     //定义要连接的服务端地址
      y1 ]+ E4 P. w8 l% C: H) b% ^
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ! G  W8 H6 O! A) l
  13.     addrServer.sin_family = AF_INET;! M8 g) |# m) u5 y, F+ ]
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    * y, P& p: {2 Z# x
  15.     //新建客户端socket8 U* B: C" r) l4 U* U
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    ) M, v" D) F+ W# f: d
  17.     int s = 0;* ~6 p6 c9 g, f8 b$ W" V
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));* G" I& J9 H( d* R
  19. ) x" C9 a  P7 P6 B) a0 H5 }- [
  20.     while (1){
    6 p5 f7 N9 n$ j- D" j
  21.         //发送数据$ _4 h9 Q5 N+ N# f, H4 ~8 B1 q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    ) I: u4 r+ G' {1 \2 J
  23.         printf("to server:");
    3 ?  Q( {0 h) \8 `- j
  24.         scanf("%s", message);
    - {- U( \) r, p. y  H
  25. ! `( P" n" F/ s4 J& j' y
  26.     }6 E. y+ ?- d' W" w* e$ `5 C$ g
  27.     //关闭socket
    8 W$ |% I% O& H5 x- V
  28.     closesocket(sockClient);+ @& _; z' R: U1 p
  29.     WSACleanup();
    * j' A( j7 s  r+ l% l& G- ^
  30. }
复制代码
求懂的高手来解答一下。/ B4 ?" D9 H% V0 l$ l8 X
谢谢了!. y8 L6 h/ b* `. C4 r1 O0 B' Y9 E2 D
- g) a* c* ?+ V1 L

3 b% v7 s2 \- l7 G0 ^9 Z; o, y; L" Z, b3 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
- l/ b- Z) ]/ J3 ~; v! trecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-16 18:09 , Processed in 0.061858 second(s), 19 queries .

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