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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
- y% ]: d9 ]) r0 a: P5 j我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。. N; w$ X" A* F% c0 I
Talk is cheak , show me the code.
; H0 o( X1 N! f0 |服务端代码:
" D" P) k! o) L. ~; g- x4 T9 c3 j& C: d" @9 ^
  1. #include<stdlib.h>6 l; v: `0 T( B3 r8 M$ o
  2. #include<WinSock2.h>
    ; @# Z& Q" H( ?3 A
  3. #pragma comment(lib,"ws2_32.lib")
    3 S+ Q& h. U4 t4 z/ V
  4. int main(){
    0 f) Z/ F( L! `8 V8 E
  5.     WSADATA wsd;
      Y$ b5 D0 l& Z" R
  6.     SOCKET sockServer;
    1 J" {" J$ M2 W+ i8 s
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号3 @* q! L* {; ]5 P' B+ P5 Y! a4 H0 g  O
  8.     SOCKET sockClient;
    ! p  W7 q0 j# G, n5 e+ [* ~
  9.     SOCKADDR_IN clientaddr;& [' o( _8 D. i  a
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口# Q" A' n- Y  S. ]; g+ d1 {
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    6 a! E0 _$ ]6 v9 U) _) R! \& ^

  12. 8 j: H; n; K7 }/ |3 b
  13. 4 u$ W$ k3 B2 V6 A+ H- Y4 D. t4 d: E
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){. [9 Q/ ?0 Q0 ?* ^9 Y2 M
  15.         printf("Socket has been created :%d", sockServer);6 F: u# U1 [  b* ~; B
  16.     }
    8 k  L8 G6 q+ E4 T" v9 R$ Z0 g, Y5 \
  17.     else{- \4 y# @" K) @3 J, J; A& v# \, _! C/ G
  18.         printf("Socket create failed.");
    - S/ z0 z' A% E9 @
  19.         exit(0);1 \; s9 U, U+ h. I* o* r
  20.     }
    / N' }0 H2 l. M' r3 E: |8 a# |% r/ [
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    0 p. @0 `) C$ E& a' _: P* {
  22.     serveraddr.sin_family = AF_INET;
    0 i  [" }% @! ^9 X9 o; F+ Q* t
  23.     serveraddr.sin_port = htons(6000);//绑定端口60006 H! x3 F: b/ R5 r% a( M" q9 d
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));, T5 O1 F# t4 Y9 ]( a& Q
  25.     char recvBuf[100];
    ; s% [2 }4 C. x5 |; q" j
  26.     int len = sizeof(SOCKADDR);8 F$ h  D7 _. {- ~
  27.     listen(sockServer, 5);//5为等待连接数+ t/ c- H( N: `& }
  28.     while (1){: U2 j( H. Y% `4 K
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    0 t; F8 Y7 L7 B* P! ^
  30.         //接收客户端数据
    ( f' @3 X  l6 Q& e3 N, T
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);! u# k) f9 L- b# `2 G9 S* Q; d
  32.         printf("to me:%s\n",recvBuf);
    8 K, C3 {( W9 j7 F, Z$ [* s
  33.         memset(recvBuf, 0, 100);
    ) D$ Q( z" ~8 N
  34.     }
    8 y4 A- g9 E! s, J) j" S
  35.     closesocket(sockClient);$ ~: A) o" ~0 A
  36.     system("pause");, N$ X# W2 q- m; H0 c
  37.     return 0;
    7 c: v% ~8 e5 Z3 r2 _+ }# r3 m
  38. }
复制代码
客户端代码:
3 q' ?: ~4 I/ M" j) ^/ _: J
  1. #include<winsock2.h>) \6 [3 A1 h$ o& Y- y  ]
  2. #include<stdio.h>3 q: D, G0 m- n, k" V
  3. #pragma comment(lib, "ws2_32.lib")$ a2 P9 H( c& g! v0 L, e; h% h
  4. void main()& C7 ]; b$ i. C5 R* |) x
  5. {: z' _8 C- i+ ~, b) P
  6.     WSADATA wsaData;
    - E6 W% |  m- p# |( P
  7.     SOCKET sockClient;//客户端Socket
    " Y- l8 X, D& S+ @& Z7 T" V" S
  8.     SOCKADDR_IN addrServer;//服务端地址
    " i, H7 H& @+ {$ p
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);1 _' }8 i0 h9 u# Q
  10.     char message[20] = "HelloSocket!";' f9 Q. c( i* ~- E% a( o+ K- v
  11.     //定义要连接的服务端地址
    ! C2 n# ]4 D+ @: P( t: o' _
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)! G; u6 I  I. v
  13.     addrServer.sin_family = AF_INET;
    / |3 N. Q# {7 @! S9 l+ C) }7 U
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    5 p! D2 L4 C: q" {; ?
  15.     //新建客户端socket
    . E4 ^0 s2 S" e7 N
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    1 I9 p0 ?2 Q) n( V6 G% Z5 G
  17.     int s = 0;( d7 X4 ~9 V9 l1 p, b
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));/ k* R% u: J% G$ S/ Q! |
  19. # Z% \5 V6 ?! M- U) W  _
  20.     while (1){2 i' _" q( _) D: V4 q1 d
  21.         //发送数据
    - Y0 g; R; Q9 E  V) C
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);4 P) H6 u* ?* |* l+ M( d3 B  V
  23.         printf("to server:");3 B$ U  p  a/ S  t- ?& o- t+ }% j
  24.         scanf("%s", message);" Z0 s9 T5 }- p
  25. 0 R3 o' O" \' j4 T$ f' O7 M4 g
  26.     }
    & i+ ~3 R" K& W# ?2 @4 u8 w1 F6 G+ m
  27.     //关闭socket
    ( p/ k3 ]) ^, M% |
  28.     closesocket(sockClient);
    % e2 o/ u  R  v  X3 q( A' ?: G9 _! o
  29.     WSACleanup();% G: s' g( n6 z
  30. }
复制代码
求懂的高手来解答一下。6 d' \: ]! i" L6 M- b# v
谢谢了!
* p, [" ~( {/ e5 A* ]- x0 T8 z

3 C* C8 I: w% R" y# r8 ]
& q3 r  c8 P9 w& p- h2 G$ j4 w/ H& d: S% e- b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为" S8 W3 F. J3 ?6 J$ e
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-9-21 03:14 , Processed in 0.059069 second(s), 19 queries .

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