问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux C语言编程,socket实现的即使通讯系统

发布网友 发布时间:2022-04-20 17:19

我来回答

2个回答

热心网友 时间:2023-09-25 04:07

Socket通信创建步骤:

(1)通过socket()函数创建socket
(2)通过bind函数绑定socket于设备地址
(3)进行读写操作read/recv/recvfrom write/send/sendto
(4)close方法关闭套接字


例子如下:

test1.c

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
  
int main(void)  
{  
    //create socket  
    int fd = socket(AF_INET, SOCK_DGRAM, 0);  
    if(fd==-1)  
    {  
        perror("socket\n");  
        exit(-1);  
    }  
    printf("socket fd=%d\n",fd);  
  
    //build connection address  
    struct sockaddr_in addr;  
    addr.sin_family = AF_INET;  
    addr.sin_port = htons(6666);  
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");  
  
    int r;  
    r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));  
    if(r==-1)  
    {  
        perror("bind");  
        close(fd);  
        exit(-1);  
    }  
    printf("bind address successful!\n");  
    //accept or send message  
    char buf[255];  
    struct sockaddr_in from;  
    socklen_t len;  
    len = sizeof(from);  
    while(1)  
    {  
        r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len);  
        if(r>0)  
        {  
            buf[r]=0;  
            printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf);  
        }  
        else  
        {  
            break;  
        }  
    }  
    //close socket  
    close(fd);  
    return 0;  
}

test2.c

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <string.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
  
int main(void)  
{  
    //create socket  
    int fd = socket(AF_INET,SOCK_DGRAM,0);  
    if(fd==-1)  
    {  
        perror("socket");  
        exit(-1);  
    }  
    printf("create socket OK!\n");  
    //create an send address  
    struct sockaddr_in addr={};  
    addr.sin_family = AF_INET;  
    addr.sin_port = htons(6666);  
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");  
    //send the message to the specify address  
    int r;  
    char buf[255];  
    while(1)  
    {  
        r = read(0,buf,sizeof(buf)-1);  
        if(r<=0)  
            break;  
        sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr));  
    }  
    //close socket  
    close(fd);  
    return 0;  
}

先运行test1.c,然后运行test2.c,在test2.c运行后输入内容,在test1.c所在终端中就会显示信息

运行结果如下:

热心网友 时间:2023-09-25 04:07

//服务端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 6000 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
#define MAXDATASIZE 100

main()
{
char buf[MAXDATASIZE];
int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in remote_addr; /* 客户端地址信息 */

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket创建出错!");
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出错!");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen出错!");
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
{
perror("accept出错");
continue;
}
printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
if (!fork())
{ /* 子进程代码段 */
if ((recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出错!");
close(client_fd);
exit(0);
}
buf[recvbytes] = '\0';
printf("from client Received: %s",buf);

if (send(client_fd, "thanks!\n", 8, 0) == -1)
perror("send出错!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}

//客户端client.c
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 6000
#define MAXDATASIZE 100

main(int argc, char *argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if (argc < 2)
{
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname出错!");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket创建出错!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect出错!");
exit(1);
}

if (send(sockfd, "hello!\n", 7, 0) == -1)
{
perror("send出错!");
exit(1);
}

if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出错!");
exit(1);
}
buf[recvbytes] = '\0';
printf("Received: %s",buf);
close(sockfd);
}
linux C语言编程,socket实现的即使通讯系统

Socket通信创建步骤:(1)通过socket()函数创建socket(2)通过bind函数绑定socket于设备地址(3)进行读写操作read/recv/recvfrom write/send/sendto(4)close方法关闭套接字 例子如下:test1.c include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;unistd.h&gt; #include &lt;netinet/in.h&gt; #in...

计算机网络socket linux下用c或c++写

s = socket(AF_INET, bTcp?SOCK_STREAM:SOCK_DGRAM, 0);if (s &lt; 1) { perror("socket(listen)"); return 0;} r = setsockopt(s, SOL_SOCKET,SO_REUSEADDR, (char *)&amp;o, sizeof(int));if (r == -1) { perror("setsockopt(listen)"); return 0;} r = bind(s, (struct s...

c语言socket

Socket广泛应用于各种网络应用中,如文件传输、即时通讯、网页浏览等。在C语言中,使用Socket API可以方便地实现这些功能。此外,Socket还可以用于实现分布式系统、游戏等复杂应用中的网络通信功能。总的来说,Socket是C语言中进行网络编程的重要工具,通过它可以实现不同计算机之间的数据通信和交换。开发者可以...

Linux下Socket网络编程聊天室 程序运行后出错,服务器端显示 accept:inva...

回答:参数不正确

LinuxC编程建立TCP连接linuxctcp

在Linux C语言编程中,可以使用socket()函数建立一个TCP连接。socket()函数的第一个参数指定协议族,例如AF_INET指定IPV4协议族,第二个参数指定套接字类型,例如SOCK_STREAM指定流式套接字。接下来,可以使用bind()函数将套接字与系统分配的IP地址和端口绑定,然后使用listen()函数使套接字变为被动...

linux下用c语言编写局域网聊天工具

include &lt;sys/socket.h&gt; include &lt;sys/wait.h&gt; define SERVPORT 5555 define BACKLOG 10 define MAX(a,b) ((a)&gt;(b)?(a):(b))void str_echo(int);void server(){ int sockfd,client_fd;struct sockaddr_in my_addr;struct sockaddr_in remote_addr;socklen_t sin_size;if((sockfd=...

linux下C语言用socket网络编程怎么计算传输速度?

这要你的通信程序协商一个协议,比如定义一个通信结构体,传文件的时候,一开始发送结构体的信息过去,告诉对端你的文件总大小,然后,传输过程中,统计已经收到或者发送的数据,做个除法就得到速率了。具体这类协商,你可以自己随便想,也可以借鉴现有的比较好的一些设计,有些考虑断点续传的技术,还有...

C语言实现socket编程TCP通信的问题?

我做试验,发现是如果你这样写:char sendbuf[1024] = {"123456\n"};也就是发送数据加上了换行,服务端立即显示了。看来不加换行就被缓存了(应该是被服务端收到但缓存了)。

请教在linux上做socket通信用C好还是C++好

但是如果你比较擅长面向对象编程,比如说用过JAVA,或是想熟悉这门思想的话,建议是用C++。效率的话不用担心,不同于JAVA,C++和C的效率差不多,关键是程序员的功力。话说回来,如果你是考虑开发应用软件的话,像是QQ什么的即时聊天工具,就用C++吧。C现在一般是用于新手入门,或者是嵌入式/通信等对...

用C语言实现socket文件传输?

include &lt;sys/socket.h&gt; include &lt;sys/wait.h&gt; define MYPORT 3490 /*定义用户连接端口*/ define BACKLOG 10 /*多少等待连接控制*/ main(){ int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd / struct sockaddr_in my_addr; /* my address information */ struct ...

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苏州一级建造师能买吗? 我是苏州2013一级建造师考生,9月15日最后一门考试把身份证忘在课桌上... 二级建造师 报名 现场确认些什么 会不会问你工作内容什么的,试探你是否... 根据我国《刑法》的规定,下列属于公共财产的是()。 苏州一级建造师报名时间是不是已经过了,要是没有赶上,今年还能有什么其 ... 盗取国家公共财产罪 我是苏州2013一级建造师考生,9月15日最后一场把身份证忘在考场了,我... 二级建造师网上报名已经通过'请问现场初审能找人代替吗我在苏州报名的... 什么是刑法中规定的公共财产,公民私人所有的财产 犯罪构成要件公私财物是什么? 西瓜苗期病害图片大全叶子发黄是怎么回事 socket编程中为什么client端的可以不用bind函数绑... 请问西瓜苗咋回事?(如图) linux socket 怎么处理大量的数据 西瓜苗长这样这是什么原因 基于Linux的远程指令系统(使用udp而不是tcp) 想要让西瓜苗长得又快又好,都有哪些小技巧呢? linux下socket编程中 bind(sockfd,(struct sockadd... 这样的西瓜苗施不施肥? linux下的bind有什么作用 西瓜苗长了这么大可以施肥吗? linux网络编程bind使用出错 西瓜幼苗,死苗是什么情况? 在Linux系统中,是否可以设置某个socket链接成功建... 大神帮我看下我的西瓜苗长得好不好,会不会结个大字瓜 怎样种西瓜苗 linux bind函数怎么释放 我的西瓜苗生病了,求西瓜种植师傅帮忙给看看,请... 如何区分西瓜苗和豆芽? 西瓜苗有嫁接苗和原生苗之分,它们有什么区别? 西瓜幼苗刚出芽要不要浇水,要怎么管理 如何实现在Linux下创建服务程序 西瓜苗的嫩头往上翘怎么回事 西瓜原苗和嫁接苗的区别 Linux下的c语言UDP编程 西瓜苗一般长多长 用c语言实现Linux中的pushd+n功能 linux BIND 服务以及用户权限问题. 怎样查询linux系统调用函数 linux c编写udp程序的bind报错 linux下socket编程中close()函数?? linux socket 如何发现主机是否活着 周的意思是什么? “周”字到底如何写? “周”汉语拼音怎么写? 肖邦的练习曲相对较简单的是哪首? 肖邦钢琴曲最简单 肖邦练习曲集的作品简介 肖邦名曲及名曲简介 请提供肖邦练习曲的详细资料。