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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
8 j4 V0 x5 ]0 _我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
* T6 ^8 Y- i1 z5 g% e4 [8 R7 UTalk is cheak , show me the code.: R, X2 A, A1 |$ ]- `& y
服务端代码:
; o( M" a- R7 Z1 s) C# E
  1. #include<stdlib.h>
    % Y9 t$ R* o6 ~+ I8 B7 ~
  2. #include<WinSock2.h>
    # t6 `( a3 I, _% {
  3. #pragma comment(lib,"ws2_32.lib")& F, l% f+ @6 `% E* N- m5 z2 [7 Q
  4. int main(){
    8 x1 S8 d9 ?1 M4 o4 X( k' S
  5.     WSADATA wsd;; V. j- L* a1 T5 }& x) K
  6.     SOCKET sockServer;, A& `5 ]2 Q% O. x
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    " f* W5 k6 @" {4 c
  8.     SOCKET sockClient;! B: W% i! R) M2 H7 C/ D
  9.     SOCKADDR_IN clientaddr;6 W0 x- F% X: P
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口7 K* d2 A9 H$ F7 y  i* Q! f
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket7 e* o: q( c" H: l
  12. + O: q% S* m/ U
  13. ) M2 U4 v8 [" ^& z; ^- t0 t
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    . [) v3 n$ J" r# S, _
  15.         printf("Socket has been created :%d", sockServer);5 K9 h3 w7 y' ?" J7 G- A
  16.     }, m# w1 y& L. P6 {4 b
  17.     else{
    . j( ]# U! V* Z  E8 J% z
  18.         printf("Socket create failed.");5 {; e9 h8 Y1 w  `" `/ O
  19.         exit(0);
    % |- W: h% a5 X/ f
  20.     }
    % }5 Y2 t$ I3 s- R) m1 S0 ?9 `
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    . M. b- A9 k8 M! {  q% M
  22.     serveraddr.sin_family = AF_INET;
    ' A& d& d3 _, B, {3 s$ C
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    1 N# _0 L/ Y' I* ~, C+ f) R- D
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));) j# l. A, k* _/ K, d, r
  25.     char recvBuf[100];
    5 }+ ?( N5 f* ]0 g
  26.     int len = sizeof(SOCKADDR);. q$ p" W. }* c. l
  27.     listen(sockServer, 5);//5为等待连接数
    4 {. m! g) G% _" H/ n
  28.     while (1){: |" o* q: X" _+ w& }9 p
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);. k+ D0 ~) }! F8 q
  30.         //接收客户端数据  a5 ~, f+ G( P; h6 y& S3 x
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    + t0 o; f2 t9 z) h. ~
  32.         printf("to me:%s\n",recvBuf);
    : w% A+ ]+ ~; g
  33.         memset(recvBuf, 0, 100);/ a% F/ q2 |8 @/ s6 _2 k
  34.     }' u! S9 n8 f& X1 b+ X5 H
  35.     closesocket(sockClient);$ U) j4 i) e# S7 B$ Y( k- i7 |
  36.     system("pause");- R8 V1 S+ Z1 I! Z0 R$ u
  37.     return 0;  ]5 Q1 w; |: z9 y
  38. }
复制代码
客户端代码:
' a$ H$ w+ b9 U* |& w
  1. #include<winsock2.h>
    + Y) [2 B9 k3 H2 q0 J
  2. #include<stdio.h>1 {7 g, c/ A( I; T
  3. #pragma comment(lib, "ws2_32.lib")( d" d! k( s( I8 F6 M
  4. void main()
    & Q* K6 T4 I. T# [
  5. {
    / ?  M" ?2 Y) k5 J' }: s" l2 T
  6.     WSADATA wsaData;; N4 Q. U3 K' z. B
  7.     SOCKET sockClient;//客户端Socket
    " u& C" x: X0 M2 ~6 k: T
  8.     SOCKADDR_IN addrServer;//服务端地址
    $ P5 u4 R9 [4 {. w6 ?% f
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);2 I; f( L6 ^# B9 [
  10.     char message[20] = "HelloSocket!";/ q) `4 K: y# b& {+ Z
  11.     //定义要连接的服务端地址: |$ Z6 K- G5 m4 O# }- Q
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    ! F2 ?2 S# {8 m% w6 ~" D1 X
  13.     addrServer.sin_family = AF_INET;
    4 s7 D; \9 G9 B! c
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    , Z2 w3 }$ }* x! z; l/ d
  15.     //新建客户端socket, g9 T& J8 h, c$ T
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* g+ Z( D. H2 e1 T7 a
  17.     int s = 0;( }' E8 N! R6 r9 K0 A6 Y8 D% u/ R
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));& ]" r3 S9 Q' H# O* T+ J/ j

  19. 7 e+ t" f) f4 l2 O9 u; p
  20.     while (1){+ b9 Y. s* u8 m3 B) k7 S7 j
  21.         //发送数据
    6 n1 c. G- N. e" o4 a( L/ }) X
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    2 K8 K. X/ j; x6 \, F2 m( P$ I
  23.         printf("to server:");0 P! _' w( B! m6 c# o6 n
  24.         scanf("%s", message);8 X4 f9 W5 [' _1 h' a2 X1 Q9 R

  25. 8 m0 P. P9 A2 A+ g( h
  26.     }) L# g/ {. P8 G9 e* Z4 |2 H, ^4 w
  27.     //关闭socket3 Z. u; d# S8 s) ]1 U
  28.     closesocket(sockClient);* p- Z0 Z" N# w2 E( h% d
  29.     WSACleanup();- z4 H0 N" m4 c) b+ S# w
  30. }
复制代码
求懂的高手来解答一下。5 N) l9 a" m8 U, c
谢谢了!$ D+ s+ V8 p1 ]$ l! @5 ~9 h
+ G$ x8 K' _0 L! _
) k# E0 T3 O6 \- l4 U7 e7 s: _7 Q

- {; r7 E" N- l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为/ G  y: }( J! f% X# \9 w: q! G
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-8-4 07:06 , Processed in 0.052182 second(s), 18 queries .

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