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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。1 m7 @; i  `3 H! |" O/ R
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
0 N% k4 o0 B( Y1 `% U- FTalk is cheak , show me the code., i9 a  s* }) I+ V+ J9 v( H: y
服务端代码:. R( O* c0 B( q3 p
  1. #include<stdlib.h>" @& ~0 E  ]6 t
  2. #include<WinSock2.h>
    3 k+ B6 V5 s, h9 Y# Y+ t% G
  3. #pragma comment(lib,"ws2_32.lib"). D  s1 a  p8 N  t7 a
  4. int main(){
    , d5 o& P" A& z4 E. Y, z9 X7 N
  5.     WSADATA wsd;
    $ g$ i1 }# e' v
  6.     SOCKET sockServer;
    ( [9 A) J* g1 i
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号+ @; c4 P4 f3 _. C) {
  8.     SOCKET sockClient;
      Z' s5 t/ j5 ?; H
  9.     SOCKADDR_IN clientaddr;
    # B% \# ?9 v3 d+ K/ s3 @5 N$ x4 w
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口5 ]2 ^9 M2 C+ q+ w
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    0 X* c& E% s  ^! d

  12. 3 h) ^/ R& @6 x! i. y" S$ R& b- W

  13. ( d# K" `5 o  }1 ]
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    9 d$ ~6 s5 i  T! q
  15.         printf("Socket has been created :%d", sockServer);" e# h: N8 R0 E6 m
  16.     }$ U3 `  `8 X) z7 N5 f; r% ~( M
  17.     else{
    : L' L! [, `. S  y
  18.         printf("Socket create failed.");6 a' c# F' X% R% p" Y4 M
  19.         exit(0);* u0 D, {7 ?9 j- q( W( `
  20.     }4 I  E0 E7 R# x4 s- S: Z6 Q
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    7 I& K" ^; ^; {. Z9 ]% L
  22.     serveraddr.sin_family = AF_INET;" w# ^$ @, z' d9 E/ o: A, \
  23.     serveraddr.sin_port = htons(6000);//绑定端口60009 e) o1 w4 q# b* w% d
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    4 @5 ?7 @3 C2 ?" f1 K
  25.     char recvBuf[100];
    5 C6 N$ m5 a& A1 R: s$ M; d
  26.     int len = sizeof(SOCKADDR);7 Y4 h+ o- _1 m1 Z2 U. z/ D! d& L6 w7 Z
  27.     listen(sockServer, 5);//5为等待连接数9 V, a- T9 ]  Z
  28.     while (1){6 p3 D5 @7 ?8 x: x  S
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    2 y2 y' ]& f& g0 b4 Z
  30.         //接收客户端数据# h  ^, m, V6 S0 {9 k
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);! n4 b# P3 f# {! X9 b
  32.         printf("to me:%s\n",recvBuf);
    2 v7 T) K+ b0 z) p
  33.         memset(recvBuf, 0, 100);
    4 W/ v" Q! C  T: N) e
  34.     }
    2 S. Z$ P6 j% s# u! j( L" V
  35.     closesocket(sockClient);4 u* Z* n* p/ i9 u6 g' Z! x
  36.     system("pause");
    ! H- d6 q  p3 J0 c  @6 A% u$ m9 ]
  37.     return 0;
    : l- z. y& ^& M- e
  38. }
复制代码
客户端代码:3 }  V. T  v1 g' W# m' E# n
  1. #include<winsock2.h>
    * R. A" X# _: s5 G' P& O* T
  2. #include<stdio.h>
    ; A+ p; r9 p6 C* X9 e0 m; U
  3. #pragma comment(lib, "ws2_32.lib")* _/ \7 Z# ^. B0 r
  4. void main()
    & v# s2 T9 K' Q0 q$ o) \
  5. {: B  V/ A0 H5 R( \" F
  6.     WSADATA wsaData;
    + Z; y! a( E- q) B3 \) }  g
  7.     SOCKET sockClient;//客户端Socket
    $ O" \, j5 `/ x
  8.     SOCKADDR_IN addrServer;//服务端地址
    2 M3 u+ O" i( k8 j
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);2 F; O( R& |4 Z8 d) V
  10.     char message[20] = "HelloSocket!";0 i9 _2 N1 l! n/ X
  11.     //定义要连接的服务端地址7 `" w; _, I. C- F) N& P: j! T
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& G6 g; ~( g2 F( j, Z
  13.     addrServer.sin_family = AF_INET;: P/ v) M. h, j& z% {8 {; c  T
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    * q  i6 Z  @5 x
  15.     //新建客户端socket
    , o& ^8 Q; Q4 p, p" P
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);6 G! B5 I; E# p; t2 E* A$ y8 h& G
  17.     int s = 0;
    3 X* U! ?, T" _# S+ I
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
      E" G+ i* F: R, B" I5 L2 H& \
  19. 8 `% F: n- |0 B5 Z
  20.     while (1){
    2 a# h7 h- Q5 O: I7 j
  21.         //发送数据
    1 O' H3 K+ I# \7 y7 f/ [/ S$ I
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);0 P  f# K9 P! j$ f, t$ b3 t
  23.         printf("to server:");& O% Y; e9 w; B2 s; y2 \
  24.         scanf("%s", message);9 W; m* A0 J" K) o  {

  25. & v5 p% G* B( {; x
  26.     }6 G- X: E6 ?" B4 ]7 S9 [) g0 f
  27.     //关闭socket
    3 `. z, y7 E5 }) M) e' Z0 A% ?0 K& D
  28.     closesocket(sockClient);3 n  k* i. c9 y2 }3 o  \
  29.     WSACleanup();$ s4 U1 k1 @5 u9 G4 ?, J; g; W
  30. }
复制代码
求懂的高手来解答一下。# d8 d% b7 F! ?% ]1 K/ z$ @
谢谢了!# ?/ D& T; i) \% J- F2 [
: w$ _% c( b5 O
' a0 b' I: y0 l- C
$ S. X* y9 Q- i# c3 `% R% E  ]/ m; i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
3 k( b5 n6 f% N' x4 u# W+ H: h4 I. Lrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-4-30 20:22 , Processed in 0.066630 second(s), 18 queries .

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