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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
% o3 S4 l7 E8 R6 z- y/ j: T, n我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。. j3 n5 P4 h7 }  L! |8 `; z0 z# {
Talk is cheak , show me the code.
/ O& Z2 a- K+ |2 ]7 T, b3 `服务端代码:( J: U# p' \" v0 c( V: g0 U
  1. #include<stdlib.h>1 _" u1 E# K0 |( T2 Y2 ?+ Q
  2. #include<WinSock2.h>
    2 K, {3 S! M9 E: U. U
  3. #pragma comment(lib,"ws2_32.lib")
    $ K1 y9 h2 R3 j" A
  4. int main(){
    4 N% R/ I7 ?; z2 l5 s6 h
  5.     WSADATA wsd;
      @4 h  G5 Z' O# P  s, h
  6.     SOCKET sockServer;6 y! k9 L$ i9 A% Q) B- t0 I+ g* h
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号0 q$ }+ {- c4 c2 F
  8.     SOCKET sockClient;' \8 T. W+ d8 {) q/ R
  9.     SOCKADDR_IN clientaddr;
    ' j& K, [7 q+ q6 ^+ ~# A
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口0 E$ o) u3 D' r8 S3 }! z1 Y! K
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    $ ?- r/ K$ v# ~$ M. h; R( B! i/ ^

  12. 7 M* T; S. ?! f8 I7 ^

  13. ! X7 h9 s$ W: x. ~
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    6 u4 f2 T( i5 K9 B- h+ h
  15.         printf("Socket has been created :%d", sockServer);1 c+ d6 U9 X1 b) E% ]. s
  16.     }
    1 T' k+ F) e4 r+ J
  17.     else{
    5 F7 V9 r4 q1 ]% Q' f$ S
  18.         printf("Socket create failed.");, \: u$ {% h/ l0 R  q
  19.         exit(0);
    , f6 K; U+ a9 c" [+ v
  20.     }
    ! ~4 _8 S1 w% J  b3 A2 o' X
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);7 ~( G1 V1 y' _* N% z$ q
  22.     serveraddr.sin_family = AF_INET;
    * f" @4 S8 b8 G/ c/ t
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    4 ?" K3 M( m8 J
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));2 H% Y6 t  S9 i  T3 G5 p9 q4 u
  25.     char recvBuf[100];3 F* n1 e' E8 f0 B0 [
  26.     int len = sizeof(SOCKADDR);6 C' q: b$ D0 G. |
  27.     listen(sockServer, 5);//5为等待连接数
    1 {7 t* R; Y9 j; w4 g, W
  28.     while (1){
    # z5 Y* T8 X8 L: l/ r; V6 F
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    " f" N% g, p) p* O# a- z
  30.         //接收客户端数据  w& V- x. f8 w2 x+ b
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    1 F5 F; A8 i( G/ Q
  32.         printf("to me:%s\n",recvBuf);
    9 A% s6 w# R! z0 o- h. {
  33.         memset(recvBuf, 0, 100);4 q4 y  R! T) {( n8 O  o
  34.     }
      c# O' j% |1 u& u2 J% |1 {
  35.     closesocket(sockClient);4 I% O2 ^1 T6 Q! c5 u  p: I
  36.     system("pause");
    , Y  L* ?! S$ J) I* E, [7 E
  37.     return 0;$ l. p5 I( g" E: O' b4 z
  38. }
复制代码
客户端代码:& w, I2 |: D' |8 m1 N. [* T
  1. #include<winsock2.h>
    9 U$ i, y) G" Q% g
  2. #include<stdio.h># ?" k5 H$ k/ f3 N: e6 \
  3. #pragma comment(lib, "ws2_32.lib")
    - }* z1 ~" O! f3 I# N6 Q4 t, S" Z
  4. void main()' `9 s3 G& d8 ~( _) W) r: a9 y4 ^- _
  5. {; `# {3 j6 i) m! @5 s
  6.     WSADATA wsaData;* U! S1 [2 S: r. `5 j- B
  7.     SOCKET sockClient;//客户端Socket
      u6 e; p  t) R4 ^& e% o
  8.     SOCKADDR_IN addrServer;//服务端地址2 T1 }$ z! v% s, w( c5 q
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ' J6 M; N3 x/ _6 c* O4 v
  10.     char message[20] = "HelloSocket!";
    * i# x( Z& d0 o( G7 P6 M6 w
  11.     //定义要连接的服务端地址2 ~1 u4 N8 O: [* ?
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址): n) w3 U' U9 u  C
  13.     addrServer.sin_family = AF_INET;# H- q  [. [8 P
  14.     addrServer.sin_port = htons(6000);//连接端口6000# u3 Q" _$ f" [" F' @. B
  15.     //新建客户端socket6 d  g; P& s7 {; `
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);. Q% C/ g6 n% e' l5 D7 ]) I* x" m5 y
  17.     int s = 0;
    7 A' M- z% s- ^8 ?7 ]7 _6 j
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: p* E/ P( e' ^! V/ T
  19. 3 ^3 u, t7 v, K$ `
  20.     while (1){
    ( e( r5 R; K/ _7 ]( c# H
  21.         //发送数据+ C/ U0 {2 o$ v; Z2 ?
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    9 Y3 u/ U$ a& u; y
  23.         printf("to server:");
    7 `0 v6 N2 D; P: I
  24.         scanf("%s", message);% A3 V' |3 z  ?2 r" d

  25. / Y2 U4 S( l. O! U
  26.     }
    : F4 P; j; C8 l8 ~, E2 b
  27.     //关闭socket
    0 b. Z# X  l" _- p
  28.     closesocket(sockClient);/ z+ K2 J; c% s; H$ D2 |
  29.     WSACleanup();# o% Y# L, i/ a! Y( x
  30. }
复制代码
求懂的高手来解答一下。
! J# V9 \, f- W$ x# h谢谢了!5 S0 I7 \8 d, n7 V9 H7 `  H% w

0 N# [+ D5 f/ {6 w4 n. d& q2 C) q; p/ G9 t! s1 }2 \- Q( H
6 e; [. l4 f8 ^. V/ ?  d, T& k) x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
% n. I3 z- h, urecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2025-2-5 19:00 , Processed in 0.108050 second(s), 18 queries .

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