① linux下socket编程,请大神详解 serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
-> 是结构体指针变量引用结构体成员变量的方法。
一般结构体引用成员变量用.(点内)。
struct stu {
char name[10];
int age ;
} s, *p=s ;
strcpy( s.name , "Jack" );
s.age=20 ;
也可以用指针来操作
strcpy( p->name , "Jack" );
p->age=20 ;
当指向容s时,与上面两句等价。
② linux下socket编程:关于文件传输的问题
接收文件客来户端的源这块代码是不是写错了?
if(buflen > 0)break;
假定你是往上写的时候的手误,那么
你的程序是否客户端/服务器端都是运行在linux,尤其是发送文件的客户端与接收文件的客户端是否都运行在linux上?
如果运行在windows上,在打开文件的时候(fopen), 必须用二进制方式打开,如
foepn("path/to/file", "rb")
否则windows下默认用文本方式打开,会把文件中的"\r\n"转换成一个字符 "\r",从而导致你看到文件大小变小的现象。
PS: 建议所有的文件传送程序,在读写文件的时候都用二进制方式打开。
③ 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[BUFLEN] = { 0 },recvbuf[BUFLEN] = { 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[1024] = {0};
char recvbuf[1024] = {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;
}
④ Linux(或C语言)和java下的socket编程有什么异同点
不同:
1.首先2者提供的接口不同,这点很容易区分。
2.java跨平台,写好的程序不用做任何修改就可以放到linux或者windows或者苹果等诸多操作系统上运行,C当然可以,但linux本身提供了socket的
系统调用
,你如果使用的是linux系统调用,那么你的程序只能在linux下运行,这点不难理解。但如果是C的
库函数
,那还是可以跨平台的
3.利用linux系统调用的速度是要快于JAVA提供的SOCKET接口。
相同性我就不说了,你看完我下面的话,你就能理解他们直接的关系了。
从你提出的问题,我觉的你可能对编程不是很了解。
socket是用来实现
进程通信
(主要是网络通信)的目的,但这不是语言能够解决的问题,确切的说语言连什么是进程他都不知道。这么说来SOCKET不是JAVA带的功能,那么JAVA是如何来实现这一功能的呢?JAVA是通过调用系统提供的SOCKET来完成的。
在LINUX里面,JAVA中的SCOKET最终就是通过调用系统提供的系统调用来完成,而系统调用的SOCKET则是操作系统和硬件共同完成的。所以他们共同点是,如果你的
JAVA程序
是在LINUX中运行的,那他们通信的具体过程会完全一样,只不过JAVA会在系统调用前面加上一些它认为必需加的东西或者是它认为能够方便编程人员使用的东西。
⑤ 请教linux下socket编程中send函数如何强制其将数据发出去
在多线程编程中其中使用一个线程来accept要连接的客户端。同时在接受client的请求之后新建一回个线程来进行具体的操答作。其操作包括向client端发送一定字节的数据,使用send()函数来进行操作。如果在发送过程中出现任何一个client端的断线,则整个程序都会退出。
ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html
上面为send函数原型,在通常的使用中flags参数一般设置为0.此时如果客户端断开,继续往里边写数据的话,会引发一个信号SIGPIPE,此信号会引发线程的退出、
解决的方法:1)可以将flags参数设置为MSG_NOSIGNAL。2)设置SIG_IGN信号处理函数。
⑥ linux下的socket编程在哪进行
LINUX下的SOCKET编程?应该所有语言都有相应的SOCKET编程接口。
C/C++、JAVA,python,RUBY,PERL,甚至是回SCEME。
只不过,其他几种都是跨平答台的,不算是单独的LINUX下SOCKET编程。一般C语言和C++才这么说。因为LINUX下的接口和WINDOWS不一样。
想知道接口有哪些的话,你得查手册或是看《UNIX环境高级编程》这类书,书上会有LINUX/UNIX的C编程接口。
编译环境的话,只要是C语言编译器,LINUX支持的主要是GCC,LINUX下的开发环境IDE也默认都用GCC了,比如CODEBLOCKS、GEANY什么的。按下编译、运行按钮就行了,和WINDOWS下开发的步骤差不多,只是接口不一样。
如果要用命令行的话,也不难,代码写好了,gcc 一下就可以编译了。不过,看你的水平,算了吧……要么安心学一下LINUX下编程,要么老实地用IDE。
问这种问题,让人很难回答的……在哪进行,当然在LINUX下,在LINUX的C语言代码文件里,什么编译环境?C语言的编译环境……什么编译工具,C语言的编译工具,比如GCC。
⑦ linux下socket编程,菜鸟求解。。。
你这个东西问题太多啦,老实说,我那过去编都编不过。我改好了,给你指出几个重大错误!
server:
#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include <unistd.h>
#include<fcntl.h>
#include<string.h>
#define IPADDR "127.0.0.1"
#define PORT 21234
const char *logpath = "./log";
int main()
{
struct sockaddr_in servaddr,cliaddr;
int sockfd,clifd,logfd;
socklen_t clilen;
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//bzero(&servaddr,sizeof(servaddr));
sockfd=socket(AF_INET,SOCK_STREAM,0);
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
listen(sockfd,8);
printf("aaaaaaaaaaaaaaaa\n");
char buf[500] = {0};
for(;;)
{
clilen = sizeof(cliaddr);
clifd=accept(sockfd,(struct sockaddr *)&cliaddr,&clilen);
printf("%d\n",clifd);
if(clifd < 0)
{
printf("cccccccccccccccccccccc\n");
continue;
}
else
{
printf("dddddddddddddddddddddddd\n");
strcpy(buf,"welcome to 127.0.0.1:21234");
send(clifd,buf,strlen(buf),0);
}
close(clifd);
}
close(sockfd);
return 0;
}
client:
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#define PORT 43212
#define SERVPORT 21234
#define SERVADDR "127.0.0.1"
int main()
{
int servfd,clifd,connre;
struct sockaddr_in servaddr,cliaddr;
clifd=socket(AF_INET,SOCK_STREAM,0);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(21234);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//bzero(&servaddr,sizeof(servaddr));
if((connre=connect(clifd,(struct sockaddr *)&servaddr,sizeof(servaddr)))<0)
{
printf("sorry,connect wrong\n");
exit(1);
}
printf("%d\n",connre);
printf("connect ok,waiting for the server's message back\n");
int length;
char buf[500];
while(1)
{
if((length = recv(clifd,buf,500,0))<0)
{
continue;
}
else
{
printf("get it ,get it\n");
break;
}
}
printf("hi,it's the client,I have recieve message :'hello,welcome' from server");
close(clifd);
return 0;
}
/////////////////////////////////
错误1:bzero(&servaddr,sizeof(servaddr)); //刚赋值又清0,why?
错误2:servaddr.sin_port = htons(PORT);//你要连的是serverport
其他的错误懒得说了,自己看吧.累死我了
⑧ socket编程在windows和linux下的区别是什么
1. 头文件
windows下winsock.h或winsock2.h
linux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)
2. 初始化
windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragma comment(lib,"Ws2_32")来告知编译器链接该lib。
linux下不需要
3. 关闭socket
windows下closesocket(...)
linux下close(...)
4. 类型
windows下SOCKET
linux下int
5. 获取错误码
windows下getlasterror()/WSAGetLastError()
linux下,未能成功执行的socket操作会返回-1;如果包含了errno.h,就会设置errno变量
6. 设置非阻塞
windows下ioctlsocket()
linux下fcntl(),需要头文件fcntl.h
7. send函数最后一个参数
windows下一般设置为0
linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可能会导致程序退出
8. 毫秒级时间获取
windows下GetTickCount()
linux下gettimeofday()
⑨ linux下socket编程中connect()函数
关闭后,要再次调用
socket(AF_INET,SOCK_STREAM,0);
来创建socket, 才可以
补充:Linux是一套免费使用和自由传播的类回Unix操作系统,是一个基于答POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
。
⑩ linux下socket编程中close()函数
只要不用抄close或fclose,不管把这个socket_fd值存到哪里,都可以使用。比如:
int socket_fd = socket(...);
int socket_x = socket_fd;
那么send(socket_x)和send(socket_fd)结果完全一致