C语言socket发送数据给前端(socket编程怎么实现数据包的转发C语言版的)

2024-09-09 13:50:06 :15

c语言socket发送数据给前端(socket编程怎么实现数据包的转发C语言版的)

大家好,今天小编来为大家解答以下的问题,关于c语言socket发送数据给前端,socket编程怎么实现数据包的转发C语言版的这个很多人还不知道,现在让我们一起来看看吧!

本文目录

socket编程怎么实现数据包的转发C语言版的

我也不知道····只好复制一份···共同学习~~ 要写网络程序就必须用Socket,这是程序员都知道的。而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,write等几个基本的操作。是的,就跟常见的文件操作一样,只要写过就一定知道。对于网络编程,我们也言必称TCP/IP,似乎其它网络协议已经不存在了。对于TCP/IP,我们还知道TCP和UDP,前者可以保证数据的正确和可靠性,后者则允许数据丢失。最后,我们还知道,在建立连接前,必须知道对方的IP地址和端口号。除此,普通的程序员就不会知道太多了,很多时候这些知识已经够用了。最多,写服务程序的时候,会使用多线程来处理并发访问。我们还知道如下几个事实:1。一个指定的端口号不能被多个程序共用。比如,如果IIS占用了80端口,那么Apache就不能也用80端口了。2。很多防火墙只允许特定目标端口的数据包通过。3。服务程序在listen某个端口并accept某个连接请求后,会生成一个新的socket来对该请求进行处理。于是,一个困惑了我很久的问题就产生了。如果一个socket创建后并与80端口绑定后,是否就意味着该socket占用了80端口呢?如果是这样的,那么当其accept一个请求后,生成的新的socket到底使用的是什么端口呢(我一直以为系统会默认给其分配一个空闲的端口号)?如果是一个空闲的端口,那一定不是80端口了,于是以后的TCP数据包的目标端口就不是80了--防火墙一定会组织其通过的!实际上,我们可以看到,防火墙并没有阻止这样的连接,而且这是最常见的连接请求和处理方式。我的不解就是,为什么防火墙没有阻止这样的连接?它是如何判定那条连接是因为connet80端口而生成的?是不是TCP数据包里有什么特别的标志?或者防火墙记住了什么东西?后来,我又仔细研读了TCP/IP的协议栈的原理,对很多概念有了更深刻的认识。比如,在TCP和UDP同属于传输层,共同架设在IP层(网络层)之上。而IP层主要负责的是在节点之间(End to End)的数据包传送,这里的节点是一台网络设备,比如计算机。因为IP层只负责把数据送到节点,而不能区分上面的不同应用,所以TCP和UDP协议在其基础上加入了端口的信息,端口于是标识的是一个节点上的一个应用。除了增加端口信息,UPD协议基本就没有对IP层的数据进行任何的处理了。而TCP协议还加入了更加复杂的传输控制,比如滑动的数据发送窗口(Slice Window),以及接收确认和重发机制,以达到数据的可靠传送。不管应用层看到的是怎样一个稳定的TCP数据流,下面传送的都是一个个的IP数据包,需要由TCP协议来进行数据重组。所以,我有理由怀疑,防火墙并没有足够的信息判断TCP数据包的更多信息,除了IP地址和端口号。而且,我们也看到,所谓的端口,是为了区分不同的应用的,以在不同的IP包来到的时候能够正确转发。TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket编程接口--原来是这么回事啊!在Socket编程接口里,设计者提出了一个很重要的概念,那就是socket。这个socket跟文件句柄很相似,实际上在BSD系统里就是跟文件句柄一样存放在一样的进程句柄表里。这个socket其实是一个序号,表示其在句柄表中的位置。这一点,我们已经见过很多了,比如文件句柄,窗口句柄等等。这些句柄,其实是代表了系统中的某些特定的对象,用于在各种函数中作为参数传入,以对特定的对象进行操作--这其实是C语言的问题,在C++语言里,这个句柄其实就是this指针,实际就是对象指针啦。现在我们知道,socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。现在我们明白,如果一个程序创建了

C语言socket编程要怎么实现服务器可以发消息给客户端

先要理解socket是什么?简单的说socket是一个全双工的通信通道,即使用TCP或者UDP通信时均可以在发送消息的同时接受消息,它不区分是否是服务器。根据这个概念你的问题就很好回答。》当客户端与服务器连接后。有什么方法使服务器可以随时随地发消息给客户端?》我现在只能。客户端发个消息给服务器。服务器才能发个消息给客户端。也就是说客户端不发消息。服务器就没法发消息给客户端。》求大牛给个思路。当连接后。客户端与服务器双方可以随时随地通信!使用多线程,一个维持接受逻辑,一个维持送信逻辑,即可完成同时接受及发送。客户端及服务器端均做上述设置。而你的做法是在一个线程中执行接受与送信,因此只能按照顺序逻辑完成接收与送信。关键点是多线程。

怎样在C语言中实现用socket传送图片

每个包有大小限制的,图片可能是太大发送失败。建议你在每个数据包里加一个类似序号的结构。然后图片数据传过去了用序号重新组合,如果缺少哪个序号,还可以用序号重新请求。包结构:序号(2字节)+包长度(4字节)+部分图片数据图片分成N份传输方;有个合成新包的函数。有个处理缺包请求的函数。接受方:有个检验碎片是否完全传过来的函数。有个组合图片碎片的函数。还应该有发送缺包请求功能的函数。

c语言写的socket程序客户端,给服务端发送消息加上时间戳,就是在消息前面加上时间

time_t t;struct tm *ti;char buffer;    time(&t); //获取时间戳ti = localtime(&t); //转成详细时间信息//格式化时间字符串sprintf(buffer, "%04d/%02d/%02d %02d:%02d:%02d ",    ti-》tm_year + 1900,     ti-》tm_mon + 1,    ti-》tm_mday,    ti-》tm_hour,    ti-》tm_min,    ti-》tm_sec);fgets(input, 1024, stdin);strcat(buffer, input); //连接两个字符串printf("%s", buffer);send(sockfd,buffer,strlen(buffer),0);//望采纳

linux下C语言socket编程双机互发数据

这个问题很好办啦,服务器接受一个连接请求,然后开一个线程或者进程都可以,再在线程或者进程里面采用其他技术实现同时收发(比如I/O复用,比如非阻塞I/O)。客户端也可以采用I/O复用。推荐资料的话,《unix网络编程》这本书很好,公认的经典,当教科书用,这本书里有你想要的所有内容。ps:你基础太差,多补补吧,别想一下吃个胖子。另外我这里正好有个例子满足你的要求,贴给你,自己写的,不是网上找的,用的是多进程加I/O复用技术:server端:/****************************************************************** ** ** ****************************************************************/#include 《stdio.h》#include 《stdlib.h》#include 《sys/types.h》#include 《sys/socket.h》#include 《arpa/inet.h》#include 《netinet/in.h》#include 《errno.h》#include 《string.h》#include 《signal.h》#include 《sys/wait.h》#include 《sys/select.h》#include 《sys/time.h》#include 《unistd.h》#define BUFLEN 1024#define MAX(a,b) ((a)》(b)?(a):(b))typedef void Sigfunc (int);void str_echo(FILE *,int);//Sigfunc *signal(int, Sigfunc *);int main(int argc,char **argv){ int connfd,listenfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr,servaddr; void sig_chld(int); listenfd = socket(AF_INET, SOCK_STREAM, 0); memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(5358); bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)); listen(listenfd,8); signal(SIGCHLD,sig_chld); while(1) { clilen = sizeof(cliaddr); if((connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen)) 《 0) { if(errno == EINTR) { fputs("accept error: EINTR\n",stdout); continue; } else { fputs("accept error..\n",stdout); } } if((childpid = fork()) == 0) { close(listenfd); str_echo(stdin,connfd); exit(0); } close(connfd); }}void str_echo(FILE *fp,int sockfd){ int n = 0; char sendbuf = { 0 }; int maxfdp; fd_set rset; FD_ZERO(&rset); while(1) { FD_SET(fileno(fp),&rset); FD_SET(sockfd, &rset); maxfdp = MAX(fileno(fp),sockfd)+1; select(maxfdp, &rset ,NULL, NULL, NULL); if(FD_ISSET(sockfd, &rset)) { if(n = read(sockfd, recvbuf, BUFLEN) == 0) { return; } if(n == -1) { break; } printf("%s\n",recvbuf); memset(recvbuf,0,BUFLEN); } if(FD_ISSET(fileno(fp),&rset)) { scanf("%s",sendbuf); write(sockfd, sendbuf,strlen(sendbuf)); } }}void sig_chld (int signo){ pid_t pid; int stat; while ((pid = waitpid(-1,&stat, WNOHANG)) 》 0) { printf("child %d terminated\n",pid); } return;}client端:#include 《stdio.h》#include 《sys/types.h》#include 《sys/socket.h》#include 《sys/select.h》#include 《arpa/inet.h》#include 《netinet/in.h》#include 《string.h》#define MAX(a,b) (a)》(b)?(a):(b)int main(){ int s,connectReturn, maxfd; fd_set rset; char sendbuf = {0}; char recvbuf = {0}; long port=5358; s=socket(PF_INET,SOCK_STREAM,0); struct sockaddr_in sa; sa.sin_family=AF_INET; sa.sin_addr.s_addr=inet_addr("127.0.0.1"); sa.sin_port=htons(port); connectReturn=connect(s,(struct sockaddr *)&sa,sizeof(sa)); printf("%d\n",connectReturn); FD_ZERO(&rset); while(1) { FD_SET(fileno(stdin), &rset); FD_SET(s, &rset); maxfd=MAX(fileno(stdin), s) + 1; select(maxfd, &rset, NULL, NULL, NULL); if(FD_ISSET(fileno(stdin), &rset)) { scanf("%s",sendbuf); send(s,sendbuf,strlen(sendbuf),0); bzero(sendbuf, 1024); } else if(FD_ISSET(s, &rset)) { memset(recvbuf,0,1024); recv(s,recvbuf,1024,0); printf("remote: %s\n",recvbuf); } } return 0;}

谁能用C语言写个最简单socket通信服务端和客户端示例

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。【服务器端】#include "stdafx.h"#include 《stdio.h》#include 《winsock2.h》#include 《winsock2.h》#define SERVER_PORT 5208 //侦听端口void main()

如果你还想了解更多这方面的信息,记得收藏关注本站。

c语言socket发送数据给前端(socket编程怎么实现数据包的转发C语言版的)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.