`
izuoyan
  • 浏览: 8937384 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

linux c socket 开发与编译实例

阅读更多

这篇日志还是先从一个能够运行起来的例子出发,一旦能顺利的看到程序的成功运行,那么接下来的事件我想应该是问为什么了?似乎这样更加容易理解和掌握。

对于socket程序的概念这里就不多写了,但我相信,如果能看完这整篇文章,我相信不会再有这样的疑问的。

下面将编写一个c/s结构的程序,主要功能是client将向server发送一些消息,而当server收到client的请求时,并向client发送一条回应信息。

server.c代码如下:

#include <stdio .h>
#include < stdlib .h>
#include < errno .h>
#include < string .h>
#include < sys /types.h>
#include < netinet /in.h>
#include < sys /socket.h>
#include < sys /wait.h>

#define SERVPORT 3333
#define BACKLOG 10
#define MAXSIZE 1024

int main() {
int sockfd,client_fd;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
//创建套接字
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
perror("socket create failed!");
exit(1);
}

//绑定端口地址
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind error!");
exit(1);
}

//监听端口
if (listen(sockfd, BACKLOG) == -1) {
perror("listen error");
exit(1);
}

while (1) {
int sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr*)&remote_addr,&sin_size)) == -1) {
perror("accept error!");
continue;
}
printf("Received a connection from %s\n", (char*)inet_ntoa(remote_addr.sin_addr));

//子进程段
if (!fork()) {
//接受client发送的请示信息
int rval;
char buf[MAXSIZE];
if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {
perror("reading stream error!");
continue;
}
printf("%s\n",buf);

//向client发送信息
char* msg = "Hello,Mr hqlong, you are connected!\n";
if (send(client_fd, msg, strlen(msg), 0) == -1) perror("send error!");
close(client_fd);
exit(0);
}
close(client_fd);
}
return 0;
}

编译并启动服务

hqlong@ubuntu:~$ gcc server.c -o server
hqlong@ubuntu:~$./server &

这里我们的server已经作为一个服务后台运行,如果想知道后台的服务的运行状态,可能使用netstat来查看.

hqlong@ubuntu:~/t$ netstat -nl | grep 3333
tcp 0 0 0.0.0.0:3333 0.0.0.0:* LISTEN

可以看出3333端口已经在监听,这说明服务已经启动。
为了测试server是否可以接受client的请求,可以使用telnet来进行测试。

hqlong@ubuntu:~$ telnet 127.0.0.1 3333
Trying 127.0.0.1...
Received a connection from 127.0.0.1
Connected to 127.0.0.1.
Escape character is '^]'.
test
test

Hello,Mr hqlong, you are connected!
Connection closed by foreign host.

可以看出,我们使用telnet来连接刚所启动的server,然后向该server发送了一条信息”test”,server收到了这条信息后,向client发送了一条响应信息,告诉我们,我们已经连接上了。

接下来来编写自己的client程序,完成的功能和上面的telnet的测试功能一样,向server发送一条信息,server在收到这条信息后,向client发送一条响应信息。
代码如下:client.c

#include < stdio .h>
#include < stdlib .h>
#include < errno .h>
#include < string .h>
#include < sys /types.h>
#include < netinet /in.h>
#include < sys /socket.h>
#include < sys /wait.h>

#define SERVPORT 3333
#define MAXDATASIZE 100
#define SERVER_IP "127.0.0.1"
#define DATA "this is a client message"

int main(int argc, char* argv[]) {
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;

if (( sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket error!");
exit(1);
}
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVPORT);
serv_addr.sin_addr.s_addr= inet_addr(SERVER_IP);

if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1) {
perror("connect error!");
exit(1);
}

write(sockfd,DATA, sizeof(DATA));
if ((recvbytes = recv(sockfd, buf, MAXDATASIZE,0)) == -1) {
perror("recv error!");
exit(1);
}

buf[recvbytes] = '\0';
printf("Received: %s",buf);
close(sockfd);
return 0;
}

编译运行

hqlong@ubuntu:~$ gcc client.c -o client
hqlong@ubuntu:~$ ./client
Received a connection from 127.0.0.1
Hello,Mr hqlong, you are connected!
Connection closed by foreign host.

以上就是整个服务器端和客户端程序的编写。


上图显示了程序使用面向连接协议(tcp)时,进行的典型socket系统调用。服务器程序建立了一个socket,并调用bind函数将此socket 和本地协议端口联系起来,然后用listen和accept函数将此socket参数置于被动的监听模式并接收到建立连接。
客户程序也建立一个socket,接着调用connect函数启动网络对话。在客户和服务器建立连接以后,就可以用read、write等函数进行通信了。
具体函数细节请参考linux c函数手册

分享到:
评论

相关推荐

    Linux-Socket-服务器编程实例.pptx

    Linux Socket服务器端编程实例 #include&lt;netdb.h&gt; Unix和Linux特有的头文件,主要定义了与网络有关的结构、变量类型、宏、函数等。所以在进行Socket网络编程时,必须要包含这个头文件。 5 Linux-Socket-服务器编程...

    linux下socket编程简单echo实例(c)

    参考我看到的那篇文章(要谢谢作者,写的还是很通俗易懂的,地址见下文),本代码可以作为socket编程的一个小入门。 这是一个参考以下文章实现的简单的echo实例: ...文章中用c++实现,我用c写了一下,没什么区别。...

    嵌入式Linux应用程序开发标准教程(第2版全)

    接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富...

    linux下c编程实例

    linux下c编程实例 一共9章。从基础的c到tcp/ip,socket等各种实例。 100%能编译,能执行。不管是新手,还是老手。都是一本好的资料。

    嵌入式Linux C编程入门(第2版) PPT

    第2章 嵌入式linux c语言开发工具 32 2.1 嵌入式linux下c语言概述 32 2.1.1 c语言简史 33 2.1.2 c语言特点 33 2.1.3 嵌入式linux c语言编程环境 34 2.2 嵌入式linux编辑器vi的使用 35 2.2.1 vi的...

    嵌入式Linux程序设计案例与实验教程-实例代码

    实验3.1 Linux内核裁剪与编译40 3.2 嵌入式引导系统技术42 3.2.1 概述42 3.2.2 Linux的引导系统——vivi与uboot43 3.3 文件系统的构建44 3.3.1 概述44 3.3.2 BusyBox45 综合实验二软盘Linux操作系统的...

    嵌入式Linux应用程序开发详解

    3.1.2 Linux下C语言编程环境概述 62 3.2 进入Vi 63 3.2.1 Vi的模式 63 3.2.2 Vi的基本流程 63 3.2.3 Vi的各模式功能键 65 3.3 初探Emacs 66 3.3.1 Emacs的基本操作 67 3.3.2 Emacs的编译概述...

    LinuxTCP/IP通信实例

    包含两个文件server.c,client.c,直接用gcc编译生成可执行文件,分别在不同的linux机器上运行。 

    Linux下C语言socket网络编程简例

     这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端;客户端在接受到数据后打印出来,然后关闭。程序里有详细的说明,其中对具体的...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第二部分

    实验3.1 Linux内核裁剪与编译40 3.2 嵌入式引导系统技术42 3.2.1 概述42 3.2.2 Linux的引导系统——vivi与uboot43 3.3 文件系统的构建44 3.3.1 概述44 3.3.2 BusyBox45 综合实验二软盘Linux操作系统的实现45 ...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第三部分

    实验3.1 Linux内核裁剪与编译40 3.2 嵌入式引导系统技术42 3.2.1 概述42 3.2.2 Linux的引导系统——vivi与uboot43 3.3 文件系统的构建44 3.3.1 概述44 3.3.2 BusyBox45 综合实验二软盘Linux操作系统的实现45 ...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第一部分

    实验3.1 Linux内核裁剪与编译40 3.2 嵌入式引导系统技术42 3.2.1 概述42 3.2.2 Linux的引导系统——vivi与uboot43 3.3 文件系统的构建44 3.3.1 概述44 3.3.2 BusyBox45 综合实验二软盘Linux操作系统的实现45 ...

    嵌入式Linux 开发ARM课件第一讲

    驱动开发实例:蜂鸣器驱动、按键驱动开发、串口驱动、触摸屏驱动、网络驱动开发、USB驱动、液晶屏驱动等。 ARMlinux移植过程。 引导程序Uboot移植。 最小系统启动开发过程。 嵌入式文件系统移植:ramdisk、JFFS2、...

    socket通信实例,TCP和UNIX域

    自己编写的socket 通信实例,用epoll实现,有server和client 是我自己从项目中提炼出来的模板,稍微扩展一下就可以用于实际项目。 采用epoll实现server,可以当做学习和练手的教材.有通信实例,有说明文档 通信接口...

    LINUX系统开发技术详解---基于ARM

    2.1.3 Linux 与ARM处理器........................................................................................ 12 2.2 ARM指令集...........................................................................

    Windows和Linux下的C++ Modbus tcp资源大全

    包含如下内容: 中文版Modbus通信协议说明 C++开发的Windows开发实例 C++开发的Linux开发实例 有多种实现方式 都能通过编译

    linux网络编程-宋敬彬-part3

    1.3 Linux与UNIX的异同 5 1.4 操作系统类型选择和内核版本的选择 5 1.4.1 常见的不同公司发行的Linux异同 6 1.4.2 内核版本的选择 6 1.5 Linux的系统架构 7 1.5.1 Linux内核的主要模块 7 1.5.2 Linux的...

    linux网络编程-宋敬彬-part2

    1.3 Linux与UNIX的异同 5 1.4 操作系统类型选择和内核版本的选择 5 1.4.1 常见的不同公司发行的Linux异同 6 1.4.2 内核版本的选择 6 1.5 Linux的系统架构 7 1.5.1 Linux内核的主要模块 7 1.5.2 Linux的...

    socket文件传输源码

    所以,可以运行在Linux下,实现Linux与Windows文件的互传。 可能的命令行会变成: olfile -dst /home/foodst.dat -src c:foo.dat -ip 10.190.1.1 -y [5. 局限和可能存在的问题] 1.程序不会对你所使用的系统...

Global site tag (gtag.js) - Google Analytics