linux socket 发送(websocket发送顺序)

这篇文章给大家聊聊关于linux socket 发送,以及websocket发送顺序对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

拔下网线,linux下sendto还能发送成功,why

sendto函数只负责将你要发送的数据复制到内核,然后自己返回。内核会尝试发送数据,你把网线拔了,内核在发送完数据后会一直尝试接收ACK,收不到的话会尝试重发该数据,一直到超时,这通常要花费几分钟的时间,你的sendto正常返回是正常的,但是过一会你再调用read,write之类的操作套接口的函数就会返回错误.

linux下的 socket编程问题!

第一个问题:

对,是那样的,用open打开文件,用read读取文件,在发送给对方,接收方接收到后,写入文件就可以了。不过在这个过程中最好别用字符串函数,除非你很熟悉。

第二个问题

首先你得去搞清楚什么是线程,什么是进程,fork出来的叫进程,pthread_create出来的才叫线程。服务器有很多种模型(多进程,多线程,select,epoll模型,这个我的blog上有,famdestiny.cublog.cn),不一定要用多进程。

给你写了个代码,自己先看看:

注意,在自己的目录下创建一个叫pserverb的文件,程序会把这个文件复制成test文件。你可以自己根据需要改改

server:

#include<stdio.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<errno.h>

#include<signal.h>

#include<sys/wait.h>

#include<sys/types.h>

#include<string.h>

#include<stdlib.h>

#include<sys/stat.h>

#include<fcntl.h>

#include<unistd.h>

#define SERV_PORT 5358

#define MAX_CONN 10

#define BUF_LEN 1024

void str_echo(FILE*fp, int sockfd){

ssize_t nread;

int file_fd;

char buf[BUF_LEN]={0};

file_fd= open("test", O_WRONLY| O_TRUNC| O_CREAT, 0755);

while(1){

bzero(buf, BUF_LEN);

if((nread= read(sockfd, buf, BUF_LEN))==-1){

if(errno== EINTR){

continue;

}

else{

printf("readn error:%s\n", strerror(errno));

continue;

}

}

else if(nread== 0){

break;

}

else{

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

write(file_fd, buf, nread);

}

}

close(file_fd);

}

void sig_chld(int sig){

pid_t pid;

int state;

while((pid= waitpid(-1,&state, WNOHANG))> 0){

printf("child process%d exited.", pid);

}

return;

}

int main(int argc, char**argv)

{

int listenfd, connfd;

socklen_t cliaddrlen;

pid_t childpid;

struct sockaddr_in servaddr, cliaddr;

if((listenfd= socket(AF_INET, SOCK_STREAM, 0))==-1){

printf("socket error:%s\n", strerror(errno));

return 0;

}

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family= AF_INET;

servaddr.sin_addr.s_addr= htonl(INADDR_ANY);

servaddr.sin_port= htons(SERV_PORT);

if(bind(listenfd,(struct sockaddr*)&servaddr, sizeof(servaddr))==-1){

printf("bind error:%s\n", strerror(errno));

return 0;

}

if(listen(listenfd, MAX_CONN)==-1){

printf("listen error:%s\n", strerror(errno));

return 0;

}

signal(SIGCHLD, sig_chld);

while(1){

cliaddrlen= sizeof(cliaddr);

if((connfd= accept(listenfd,(struct sockaddr*)&cliaddr,&cliaddrlen))==-1){

if(errno== EINTR){

continue;

}

else{

printf("accept error:%s\n", strerror(errno));

continue;

}

}

if((childpid= fork())== 0){

close(listenfd);

str_echo(stdin, connfd);

exit(0);

}

else if(childpid> 0){

close(connfd);

}

else{

printf("fork error!\n");

continue;

}

}

}

client:

#include<stdio.h>

#include<unistd.h>

#include<errno.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include<string.h>

#include<sys/stat.h>

#include<fcntl.h>

#include<stdlib.h>

#define SERV_ADDR"127.0.0.1"

#define SERV_PORT 5358

#define BUF_LEN 1024

void str_cli(char*path, int sockfd)

{

char sendbuf[BUF_LEN]={0};

int fd, n;

if((fd= open("./pserverb", O_RDONLY))==-1){

printf("%s\n", strerror(errno));

exit(0);

}

while((n= read(fd, sendbuf, BUF_LEN))!= 0){

if(n< 0){

printf("%s\n", strerror(errno));

exit(0);

}

write(sockfd, sendbuf, n);

bzero(sendbuf, BUF_LEN);

}

close(fd);

return;

}

int main(int argc, char**argv)

{

int fd;

struct sockaddr_in servaddr;

fd= socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family= AF_INET;

servaddr.sin_addr.s_addr= inet_addr(SERV_ADDR);

servaddr.sin_port= htons(SERV_PORT);

if(connect(fd,(struct sockaddr*)&servaddr, sizeof(servaddr))==-1){

printf("connect error:%s\n", strerror(errno));

return 0;

}

str_cli(argv[1], fd);

return 0;

}

socket linux c++ send()函数

给你一个代码,linux下编译运行即可,做了简单的注释,client.c如下:

send()函数在client.c末尾

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<errno.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

#defineMAXLINE4096//发送接受信息长度

#definePORT6666//端口

intmain(intargc,char**argv)

{

intsockfd,n;

charrecvline[MAXLINE],sendline[MAXLINE];

structsockaddr_inservaddr;

if(argc!=2){

printf("usage:./client<ipaddress>\n");//使用方法

exit(0);

}

if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){//创建套接字,并未连接

printf("createsocketerror:%s(errno:%d)\n",strerror(errno),errno);

exit(0);

}

//memset(结构体地址,清零,要清零的长度);清零结构体servaddr,将结构体数据全部设置为0

//同bzero(结构体地址,要清理的长度);默认清零

memset(&servaddr,0,sizeof(servaddr));

servaddr.sin_family=AF_INET;//sa_family是通信类型,最常用的值是"AF_INET"

servaddr.sin_port=htons(PORT);//端口号

//servaddr.sin_addr.s_addr=inet_addr(argv[1]);//服务器IP,如下功能相同

if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0){

printf("inet_ptonerrorfor%s\n",argv[1]);

exit(0);

}

//连接服务器

if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0){

printf("connecterror:%s(errno:%d)\n",strerror(errno),errno);

exit(0);

}

printf("sendmsgtoserver:\n");

fgets(sendline,MAXLINE,stdin);//输入向服务器发送的信息

if(send(sockfd,sendline,strlen(sendline),0)<0)//向服务器发送信息

{

printf("sendmsgerror:%s(errno:%d)\n",strerror(errno),errno);

exit(0);

}

close(sockfd);//关闭套接字

exit(0);

}

服务器程序:server.c如下:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<errno.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

#defineMAXLINE4096

#definePORT6666

intmain(intargc,char**argv)

{

intlistenfd,connfd;

structsockaddr_inservaddr;

charbuff[MAXLINE];

intn;

if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){//创建套接字

printf("createsocketerror:%s(errno:%d)\n",strerror(errno),errno);

exit(0);

}

memset(&servaddr,0,sizeof(servaddr));//结构体清零

servaddr.sin_family=AF_INET;//sa_family是通信类型,最常用的值是"AF_INET"

servaddr.sin_addr.s_addr=htonl(INADDR_ANY);//指定接受任何连接

servaddr.sin_port=htons(PORT);//监听端口

//给套接口绑定地址

if(bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr))==-1){

printf("bindsocketerror:%s(errno:%d)\n",strerror(errno),errno);

exit(0);

}

if(listen(listenfd,10)==-1){//开始监听,最大请求数为10,可以自己设置

printf("listensocketerror:%s(errno:%d)\n",strerror(errno),errno);

exit(0);

}

printf("======waitingforclient'srequest======\n");

while(1){

//建立通信,等待客户端connect()函数的连接

if((connfd=accept(listenfd,(structsockaddr*)NULL,NULL))==-1)

{

printf("acceptsocketerror:%s(errno:%d)",strerror(errno),errno);

continue;

}

n=recv(connfd,buff,MAXLINE,0);//n可以判断错误,此处可直接用recv()函数

//接收到的信息存放在buff中

buff[n]='\0';//添加结束符

printf("recvmsgfromclient:%s\n",buff);

close(connfd);

}

close(listenfd);

}

阅读剩余
THE END