A. linux C语言编程,socket实现的即使通讯系统
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>
intmain(void)
{
//createsocket
intfd=socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror("socket ");
exit(-1);
}
printf("socketfd=%d ",fd);
//buildconnectionaddress
structsockaddr_inaddr;
addr.sin_family=AF_INET;
addr.sin_port=htons(6666);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
intr;
r=bind(fd,(structsockaddr*)&addr,sizeof(addr));
if(r==-1)
{
perror("bind");
close(fd);
exit(-1);
}
printf("bindaddresssuccessful! ");
//acceptorsendmessage
charbuf[255];
structsockaddr_infrom;
socklen_tlen;
len=sizeof(from);
尘梁空while(1)
{
r=recvfrom(fd,buf,sizeof(buf)-1,0,(structsockaddr*)&from,&len);
if(r>0)
{
buf[r]=0;
printf("Themessagefrom%sis:%s ",inet_ntoa(from.sin_addr),buf);
}
else
{
break;
}
}
//closesocket
close(fd);
return0;
}
test2.c
java">#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
intmain(void)
{
//createsocket
intfd=socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror("socket");
exit(-1);
}
printf("createsocketOK! ");
//createansendaddress
structsockaddr_inaddr={};
addr.sin_family=AF_INET;
addr.sin_port=htons(6666);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
//
intr;
派瞎charbuf[255];
while(1)
{
r=read(0,buf,sizeof(buf)-1);
if(r<=0)
break;
sendto(fd,buf,r,0,(structsockaddr*)&addr,sizeof(addr));
}
//closesocket
渣凳close(fd);
return0;
}
先运行test1.c,然后运行test2.c,在test2.c运行后输入内容,在test1.c所在终端中就会显示信息
运行结果如下:
B. Windows Socket和Linux Socket编程的区别 ZZ
socket相关程序从Windows移植到Linux下需要注意的:
1)头文件
Windows下winsock.h/winsock2.h
Linux下sys/socket.h
错误处理:errno.h
2)初始化
Windows下需要用WSAStartup
Linux下不需要
3)关闭socket
Windows下closesocket(...)
Linux下close(...)
4)类型
Windows下SOCKET
Linux下int
如我用到的一些宏:
#ifdef WIN32
typedef int socklen_t;
typedef int ssize_t;
#endif
#ifdef __Linux__
typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
#define FALSE 0
#define SOCKET_ERROR (-1)
#endif
5)获取错误码
Windows下getlasterror()/WSAGetLastError()
Linux下errno变量
6)设置非阻塞
Windows下ioctlsocket()
Linux下fcntl() <fcntl.h>
7)send函数最后一个参数
Windows下一般设置为0
Linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可 能会导致程序退出。
8)毫秒级时间获取
Windows下GetTickCount()
Linux下gettimeofday()
3、多线程
多线程: (win)process.h --〉(Linux)pthread.h
_beginthread --> pthread_create
_endthread --> pthread_exit
一、linux下的socket编程:
1、客户端执行步骤依次如下:
socket()
connect()
send()或者recv()
close()
注意的是,connect之前要填充地址结构体,IP地址转换为网络字节序,一般用inet_aton().
2、服务器端:
socket()
bind()
listen()
accpet()
recv()或者send()
close()
(ps:一般通过将send()和recv()的最后一个参数赋为0或者1来区分阻塞与非阻塞,其中0对应阻塞,1对应非阻塞)
二、windows下的网络编程:
做过windows网络编程的人都知道,微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。即windows既提供上层的网络API函数也提供底层的API函数。
1、对于采用上层的API函数而言:若采用csocket类定义一个对象obj的话,那么进行网络编程的步骤如下:
客户端:
obj.Create()
obj.Connect()
obj.Receive()或者obj.Send()
obj.Close()
服务器端:
先调用AfxSocketInit()检测协议栈安装情况
obj.Create()
obj.Listen()
obj.Accpet()
obj.Receive()或者obj.Send()
obj.Close()
2、对于采用底层的API函数而言,步骤如下:
客户端:
WSAStartup()
socket()
connect()
send()或者recv()
closesocket()
服务器端:
WSAStartup()
socket()
bind()
listen()
accpet()
send()
recv()
closesocket()
(ps:windows下CSocket类为同步方式,有阻塞现象;CASyncSocket为异步方式,无阻塞现象。)
通过以上比较可以发现:linux下的网络编程与windows下采用底层的API类似,但是也有区别:
区别一:windows下需加上WSAStartup()函数
区别二:关闭socket:linux为close(),windows为closesocket()
windows下采用上层的API,一般有CSocket和CAsynSocket这两种类型的类
这种情况以下socket函数一般的首字母大写。而底层的API不管是windows下的还是linux下的socket函数首字母都是小写的。
C. 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时,与上面两句等价。
D. 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。
E. linux socket 编程
这类问题,你不用考虑太复杂的,可以直接使用socket提供的tcp服务接口,通过send和recv等函数处理就行了。数据建议自行写封装和解封函数,
接口类似这样:int pack(char *, struct data *); int unpack(char *, struct data *);
可以按照你自己的喜好,将你的struct按照你的方式填入一个char*里面(你直接将struct data*类型转换后赋值给char*类型都行),然后就可以使用接口了;
你完全不用管tcp的实现机制的,tcp有拥塞控制,超时重传,自动分包等机制,可以保证你的数据按准确的方式送达;
像什么包的数据头什么的,如果你需要定义的是应用层的协议,或者你希望自定义网络层和传输层(使用raw方式的socket),你才需要考虑;
F. linux socket编程 麻烦达人给一下程序的注释
客户端:
int main()
{ int sockfd;//sokce fd 可以man socket 看socket();这个函数的原型
int len;
struct sockaddr_in address;//connect的函数参数,主要是服务器的ip和端口
int result;
char ch = `A`;//发送的消息
sockfd = socket(AF_INET,SOCK_STREAM,0); address.sin_family = AF_INET; //创建socket
address.sin_addr.s_addr = inet_addr(“127.0.0.1”);//设置服务器的ip地址
address.sin_port = 9734;//设置端口
len = sizeof(address); //传给connect函数的长度
result = connect(sockfd,(struct sockaddr *)&address,len);
if(result == -1) {//连接到服务器,成功返回0,注意这里是阻塞方式
peror(“oops:client1”);
exit(1); }
write(sockfd,&ch,1); //往服务器发送消息
read(sockfd,&ch,1);//从服务器读回消息,存放到ch
printf(“char from server = c\n”,ch);//读回的消息,打印
close(sockfd);
exit(0); }
服务器端:
#include<sys/types.h> #include<sys/socket.h>
#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
int main()
{ int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
server_sockfd = socket(AF_INET,SOCK_STEAM,0);
server_address.sun_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(“127.0.0.1”);
server_address.sin_port = 9734;
server_len = sizeof(server_address);
上面部分从简
bind(server_sockfd,(struct sockaddr *)&server_address,server_len); //绑定端口和ip,
listen(server_sockfd,5);//运竖服务器开始监听端口
while(1){
char ch;
printf(‘server waiting\n”);
client_len = sizeof(client_address); client_sockfd = accept(server_sockfd,(struct sockaddr*)
&client_address,&client_len);//开始等待客户端连接,如果没有,则阻塞
read(client_sockfd,&ch,1); //建掘拍立一个连接后,从客户端读取消息
ch++;//A=>B
write(client_sockfd,&ch,1);//写回客户端
close(client_sockfd);}
这是一个简单测试网络连接的程序,其实如果做服务判悄羡器的话,一般采用的是select +noblocking 或 多线程,线程池,或多进程,进程池。。。
做了个简单的分析,如果不明白的地方,可以发我邮件[email protected]
G. linux下socket编程中close()函数
只要不用close或fclose,不管把这个socket_fd值存到哪里,都氏腊旁可以使用。比如:歼橡
int
socket_fd
=
socket(...);
int
socket_x
=
socket_fd;
那么send(socket_x)和send(socket_fd)结果完全一局李致
H. linux socket编程代码解析
很简单的一个socket server端和client端通信程序啊!
server端监听端口,client主动连接server端,连接上后client端先将student这样一个结构体数据发送给server端,server端线接受这个结构体数据,然后再向client端发送这个student结构体数据,client端接收。
ok,通信过程完成。
I. 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()
J. linux socket编程相关
你再调用一下 getsockopt 看看 SO_REUSEADDR 设置成功了没有。