linux网络编程项目(linux系统编程项目)
linux网络编程应该学习哪些东西
Linux网络编程一般用C语言,也用C++语言,因为有些网络编程的库是C++的,所以C/C++编程基础最起码要有;另外基础知识部分就是网络原理要学,还有Linux平台的基本编程技术(socket、文件相关的系统调用)。Linux网络编程基本上是一些编程技巧和代码库的运用以及编程经验的积累,学习到一定程度了可以试着编写一些网络服务器程序。
Linux C语言网络编程问题!
unsigned int dir(char * server) {
int sck;//套接字变量
struct sockaddr_in serv_adr; //远程主机的地址
struct hostent *host; //指向远程主机的指针
unsigned char databuf[FILEBUF_SIZE]; //数据
int bytes = 0, bytesread = 0; //字节数,读取到的字节数
host = gethostbyname(server); //根据远程主机的主机名,得到指向远程主机的指针
if (host == (struct hostent *) NULL) { //如果得到指向远程主机的指针失败,报告错误,并返回
perror("gethostbyname failed");
return 0;
}memset(serv_adr, 0, sizeof(serv_adr)); //初始化远程主机的地址,结构体内所有成员清零
serv_adr.sin_family = AF_INET; //设置地址类型
memcpy(serv_adr.sin_addr, host-h_addr, host-h_length);//取出指向远程主机的指针中包含的地址信息,赋给远程主机地址变量
serv_adr.sin_port = htons(SERVICE_PORT);//设置端口号,比如http服务对应80端口,ftp对应21端口
if ((sck = socket(AF_INET, SOCK_STREAM, 0)) 0) { //如果建立TCP协议的套接字失败,报告错误,并返回
perror("error on socket()");
return 0;
}
if (connect(sck, (struct sockaddr *)serv_adr, sizeof(serv_adr)) 0) {//如果使用该套接字连接到远程主机失败,报告错误,并返回
perror("error on connect()");
return 0;
}write(sck, "DI\n\n", 4); //连接成功,发送内容为"DI\n\n"的消息,远程主机收到该消息,解析后生成目录列表,并将目录列表信息传递回来
printf("Remote directory listing:\n");//输出提示信息“远程主机正在生成目录列表”
while ((bytes = read(sck, databuf, FILEBUF_SIZE)) 0) { //从套接字的数据流中读取远程主机的返回信息(即目录列表),每次读取FILEBUF_SIZE个字节,直到全部读取完毕
write(fileno(stdout), databuf, bytes);//将每次读到的数据,输出到标准输出流(stdout),即屏幕上
bytesread += bytes;//接收到的字节数累加
}
close(sck); /* Close the socket */ //通信完成,关闭套接字,关闭连接
return bytesread; //返回读取到的字节数(即远程主机返回的信息的大小)
}
linux系统网络编程主要是学什么??要用到哪些概念和函数??最好是举例说明,要详细些?
多线程和多进程要学。socket套接字要学。TCP/UDP也要学。这些是基本肯定要学的吧,其余的就不知道你们研究多深了。用到的函数太多了- -!而且函数的参数也多的一笔,很难记的,有帮助手册了还好。
linux网络编程
晕刚才忘了登陆,有什么问题就往这个号发吧
最大的可能就是发起tcp连接的数据包被防火墙拦住了,你可以这样验证一下
1,看服务器和客户机同时在一台机器上是否能够连接成功(保证你程序的正确)
如果一台能够成功的话,就说明数据包被服务器端的防火墙拦截了
如果你用的是红帽系列的(fedora也是)可以用service iptables stop关掉防火墙,或者在防火墙上打开服务器监听的端口。如果还不行的话,建议你用tcpdump或者wireshark抓包看一下。
linux tcp/ip 网络通信编程
/*************************************
文件名:?server.c?
linux?下socket网络编程简例??-?服务端程序
服务器端口设为?0x8888???(端口和地址可根据实际情况更改,或者使用参数传入)
服务器地址设为?192.168.1.104
作者:kikilizhm#163.com?(将#换为@)
*/
#include?stdlib.h
#include?sys/types.h
#include?stdio.h
#include?sys/socket.h
#include?linux/in.h
#include?string.h
int?main()
{
int?sfp,nfp;?/*?定义两个描述符?*/
struct?sockaddr_in?s_add,c_add;
int?sin_size;
unsigned?short?portnum=0x8888;?/*?服务端使用端口?*/
printf("Hello,welcome?to?my?server?!\r\n");
sfp?=?socket(AF_INET,?SOCK_STREAM,?0);
if(-1?==?sfp)
{
????printf("socket?fail?!?\r\n");
????return?-1;
}
printf("socket?ok?!\r\n");
/*?填充服务器端口地址信息,以便下面使用此地址和端口监听?*/
bzero(s_add,sizeof(struct?sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=htonl(INADDR_ANY);?/*?这里地址使用全0,即所有?*/
s_add.sin_port=htons(portnum);
/*?使用bind进行绑定端口?*/
if(-1?==?bind(sfp,(struct?sockaddr?*)(s_add),?sizeof(struct?sockaddr)))
{
????printf("bind?fail?!\r\n");
????return?-1;
}
printf("bind?ok?!\r\n");
/*?开始监听相应的端口?*/
if(-1?==?listen(sfp,5))
{
????printf("listen?fail?!\r\n");
????return?-1;
}
printf("listen?ok\r\n");
while(1)
{
sin_size?=?sizeof(struct?sockaddr_in);
/*?accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处,
???不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。
???此处accept的第二个参数用于获取客户端的端口和地址信息。
????*/
nfp?=?accept(sfp,?(struct?sockaddr?*)(c_add),?sin_size);
if(-1?==?nfp)
{
????printf("accept?fail?!\r\n");
????return?-1;
}
printf("accept?ok!\r\nServer?start?get?connect?from?%#x?:?%#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
/*?这里使用write向客户端发送信息,也可以尝试使用其他函数实现?*/
if(-1?==?write(nfp,"hello,welcome?to?my?server?\r\n",32))
{
????printf("write?fail!\r\n");
????return?-1;
}
printf("write?ok!\r\n");
close(nfp);
}
close(sfp);
return?0;
}
/*************************************
文件名:?client.c?
linux?下socket网络编程简例??-?客户端程序
服务器端口设为?0x8888???(端口和地址可根据实际情况更改,或者使用参数传入)
服务器地址设为?192.168.1.104
作者:kikilizhm#163.com?(将#换为@)
*/
#include?stdlib.h
#include?sys/types.h
#include?stdio.h
#include?sys/socket.h
#include?linux/in.h
#include?string.h
int?main()
{
int?cfd;?/*?文件描述符?*/
int?recbytes;
int?sin_size;
char?buffer[1024]={0};????/*?接受缓冲区?*/
struct?sockaddr_in?s_add,c_add;?/*?存储服务端和本端的ip、端口等信息结构体?*/
unsigned?short?portnum=0x8888;??/*?服务端使用的通信端口,可以更改,需和服务端相同?*/
printf("Hello,welcome?to?client?!\r\n");
/*?建立socket?使用因特网,TCP流传输?*/
cfd?=?socket(AF_INET,?SOCK_STREAM,?0);
if(-1?==?cfd)
{
????printf("socket?fail?!?\r\n");
????return?-1;
}
printf("socket?ok?!\r\n");
/*?构造服务器端的ip和端口信息,具体结构体可以查资料?*/
bzero(s_add,sizeof(struct?sockaddr_in));
s_add.sin_family=AF_INET;
s_add.sin_addr.s_addr=?inet_addr("192.168.1.104");?/*?ip转换为4字节整形,使用时需要根据服务端ip进行更改?*/
s_add.sin_port=htons(portnum);?/*?这里htons是将short型数据字节序由主机型转换为网络型,其实就是
????将2字节数据的前后两个字节倒换,和对应的ntohs效果、实质相同,只不过名字不同。htonl和ntohl是
????操作的4字节整形。将0x12345678变为0x78563412,名字不同,内容两两相同,一般情况下网络为大端,
????PPC的cpu为大端,x86的cpu为小端,arm的可以配置大小端,需要保证接收时字节序正确。
?*/
printf("s_addr?=?%#x?,port?:?%#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port);?/*?这里打印出的是小端
????和我们平时看到的是相反的。?*/
/*?客户端连接服务器,参数依次为socket文件描述符,地址信息,地址结构大小?*/
if(-1?==?connect(cfd,(struct?sockaddr?*)(s_add),?sizeof(struct?sockaddr)))
{
????printf("connect?fail?!\r\n");
????return?-1;
}
printf("connect?ok?!\r\n");
/*连接成功,从服务端接收字符*/
if(-1?==?(recbytes?=?read(cfd,buffer,1024)))
{
????printf("read?data?fail?!\r\n");
????return?-1;
}
printf("read?ok\r\nREC:\r\n");
buffer[recbytes]='\0';
printf("%s\r\n",buffer);
getchar();?/*?此句为使程序暂停在此处,可以使用netstat查看当前的连接?*/
close(cfd);?/*?关闭连接,本次通信完成?*/
return?0;
}