C语言实现socket简单通信实例

 更新时间:2014年09月20日 15:13:38   投稿:shichen2014  
这篇文章主要介绍了C语言实现socket简单通信的方法,是学习C语言网络编程非常基础而又实用的实例,需要的朋友可以参考下

本文实例讲述了C语言实现socket简单通信的方法,分享给大家供大家参考。具体实现方法如下:

服务器端代码如下:

/*
============================================================================
Name : server.c
Author : king
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdlib.h>
#include <pthread.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h> /* inet(3) functions */

#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

int handle(int point);

int main(void) {
int sfd, ind;
struct sockaddr_in addr;
struct sockaddr_in clent;
char resv[1024], sendbuf[1024];
char buf[1024];
char * myaddr = "192.168.231.128";

int ret; // 返回值设置
socklen_t lent;
int pid;
addr.sin_family = AF_INET; //IPv4 Internet protocols

addr.sin_port = htons(5050); //这里输入服务器端口号

addr.sin_addr.s_addr = inet_addr(myaddr);
; //INADDR_ANY表示本机IP

//獲取socket描述符,IPV4asd
printf("socket start \n");
sfd = socket(AF_INET, SOCK_STREAM, 0);

if (sfd < 0) {
printf("socket error \n");
return -1;
}
printf("bind start \n");
//将套接子与指定端口链接
if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr)) < 0) {
printf("bind error \n");
return -1;
}

//监听套接子
printf("listen start \n");
if (listen(sfd, 1024) < 0) {
printf("listen error \n");
return -1;
}

for (;;) {
//接受来自客户端的信息
printf("accept start \n");
memset(&clent, 0, sizeof(clent));
lent = sizeof(clent);
ind = accept(sfd, (struct sockaddr *) &clent, &lent);
if (ind < 0) {
printf("accept error %d \n", ind);
return -1;
}

printf("infor \n");
printf("clent addr%s porit %d\n",
inet_ntop(AF_INET, &clent.sin_addr, buf, sizeof(buf)),
ntohs(clent.sin_port));

pid = fork();

if (pid == 0) {
//子进程
close(sfd);
handle(ind);
} else if (pid < 0) {
//error
close(ind);
} else {
//父进程
}
}

return EXIT_SUCCESS;

}

int handle(int point) {

int retn;
char buf[1024];

for (;;) {
retn = read(point, buf, sizeof(buf));
if (retn < 0) {
printf("read error \n");
close(point);
break;
} else if (retn == 0) {
printf("client exit \n");
close(point);
break;
}

printf("client:%s\n", buf);

if (strcmp("exit", buf) == 0) {
printf("exit \n");
close(point);
return 0;
}
}
return 0;
}

客户端代码如下:

/*
 ============================================================================
 Name    : client.c
 Author   : king
 Version   :
 Copyright  : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>    /* inet(3) functions */

int handle(int fd);

int main(void) {

  int nsd;
  char buf[1024];

  char * myaddr = "192.168.231.128";
  struct sockaddr_in addr;

  printf("welcome to echo client\n");
  nsd = socket(AF_INET, SOCK_STREAM, 0);
  printf("connect start1 \n");
  //bzero(addr, sizeof(*addr));
  memset(&addr,0,sizeof(addr));
  printf("connect start2 \n");
  addr.sin_family = AF_INET;
  addr.sin_port = htons(5050);
  addr.sin_addr.s_addr=inet_addr(myaddr);

  printf("connect start3 \n");
  if (connect(nsd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0) {
    printf("connect error \n");
    return -1;
  }

  sleep(5);
  printf("handle start\n");
  handle(nsd);
  close(nsd);
  return EXIT_SUCCESS;
}

int handle(int fd) {

  char sendl[1024], rev[1024];

  int retn;

  for (;;) {

    memset(sendl,0,sizeof(sendl));
    memset(rev,0,sizeof(rev));
    if (fgets(sendl, 1024, stdin) == NULL) {
      break;
    }
    //
    printf("wirte start\n");
    write(fd, sendl, strlen(sendl));
    read(fd, rev,strlen(rev));

  }

  return 0;
}

注意:
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
记住一定是值 addrlen
accept   socklen_t *addrlen要是一个指针

希望本文所述对大家C语言网络程序设计的学习有所帮助。

相关文章

  • C++使用函数的一些高级操作指南

    C++使用函数的一些高级操作指南

    C++中函数调用的方法与C语言并无区别,依旧是在调用方函数中执行函数调用语句来实现函数调用,下面这篇文章主要给大家介绍了关于C++使用函数的一些高级操作,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • c++中queue用法超详细讲解(入门必看!)

    c++中queue用法超详细讲解(入门必看!)

    queue是一种容器转换器模板,调用#include< queue>即可使用队列类,下面这篇文章主要给大家介绍了关于c++中queue用法超详细讲解的相关资料,需要的朋友可以参考下
    2022-10-10
  • C++连接mysql的方法(直接调用C-API)

    C++连接mysql的方法(直接调用C-API)

    首先安装mysql,点完全安装,才能在在安装目录include找到相应的头文件,注意,是完全安装,需要的朋友可以参考下
    2017-06-06
  • 二叉树入门和刷题详解

    二叉树入门和刷题详解

    这篇文章主要介绍了二叉树入门和刷题详解的相关资料,需要的朋友可以参考下
    2023-07-07
  • C++实现团购订单管理系统

    C++实现团购订单管理系统

    这篇文章主要为大家详细介绍了如何利用C++实现团购订单管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-12-12
  • Qt控件点击消息获取的方法详解

    Qt控件点击消息获取的方法详解

    本文将利用Qt中的QLabel、QPushButton这两个控件,为大家详细介绍一下Qt控件点击消息获取的方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-06-06
  • C++ Qt开发之使用QTcpSocket实现TCP网络通信

    C++ Qt开发之使用QTcpSocket实现TCP网络通信

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,本文主要为大家介绍了如何运用QTcpSocket组件实现基于TCP的网络通信功能,需要的可以参考下
    2024-03-03
  • C语言实现系统关机注销功能

    C语言实现系统关机注销功能

    这篇文章主要为大家详细介绍了C语言实现系统关机注销功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C++成员初始化列表

    C++成员初始化列表

    这篇文章主要介绍了C++成员初始化列表,除了可以使用构造函数对类成员进行初始化之外,C++还提供了另外一种初始化的方法,叫做成员初始化列表。下面来看看文章的详细吧,需要的朋友可以参考一下
    2022-01-01
  • C++11如何实现无锁队列

    C++11如何实现无锁队列

    这篇文章主要介绍了C++11如何实现无锁队列,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08

最新评论