system("echo ONBOOT=yes >>/etc/sysconfig/network-scripts/ifcfg-eth0")
system("echo BOOTPROTO=static >>/etc/sysconfig/network-scripts/ifcfg-eth0")
system("echo IPADDR=192.168.10.10 >>/etc/sysconfig/network-scripts/ifcfg-eth0")
system("echo NETMASK=255.255.255.0 >>/etc/sysconfig/network-scripts/ifcfg-eth0")system("/sbin/service network restart")
exit(0)忘了说了,记得包含stdlib.h这个头文件
------------------你学习C语言的网络编程,我建议你到LINUX下去学
给你一个例子程序是一个局域网聊天服务器
------------------
#define SAY_HELLO 0 /*发送欢迎信息*/
#define SEND_MESSAGE 1 /*转发聊天信息*/
#define CHANGE_NAME 2 /*更改用户名*/
#define REFLESH_LIST 3 /*刷新用户名列表*/
#define CLIENT_LEFT4 /*客户端离开*/
#define CLIENT_COME 5 /*客户加入*/
#define SEND_RECV_FILE 6 /*发送接收文件*/
#define END_OF_FILE 7 /*文件发送结束标记*/
#define FILE_BLOCK 1024/*读取文件的块大小*/
#define MAX_CHATER 100 /*服务器最大同时容纳人数*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netdb.h>
#include <fcntl.h>
#include <bits/time.h>
/*服务端发送欢迎信息*/
struct Message0{
int Func_number /*功能号: 此处取0 SAY_HELLO
1------表示转发信息
2------表示转发更名通知
3------表示传送当前用户列表
4------表示客户端离开
5------表示客户加入
6------表示发送和接收文件
*/
char msg[50] /* 欢迎信息 */
char username[50] /* 服务器端生成的用户名称 */
}
/*服务器端与客户端信息转发数据结构*/
struct Message1{
int Func_number /*功能号: 此处取1 SEND_MESSAGE
1------表示转发信息
2------表示转发更名通知
3------表示传送当前用户列表
4------表示客户端离开
5------表示客户加入
6------表示发送和接收文件
*/
char msg[201] /* 转发的信息 */
char send_user_name [50]/* 发送数据的用户呢称 */
char recv_user_name [50]/* 接收数据的用户名称 */
}
/*服务器端转发更名通知*/
struct Message2{
int Func_number /*功能号: 此处取2 CHANGE_NAME
1------表示转发信息
2------表示转发更名通知
3------表示传送当前用户列表
4------表示客户端离开
5------表示客户加入
6------表示发送和接收文件
*/
char oldname[50] /* 转发更名通知信息 */
char newname[50]
}
/*服务器保存当前所有用户列表的数据结构*/
struct User{
char user_name[50] /* 用户呢称 */
char user_address[15] /* 该用户IP地址 */
}
/*服务器转发在线用户列表*/
struct Message3{
int Func_number /*功能号: 此处取3 REFLESH_LIST
1------表示转发信息
2------表示转发更名通知
3------表示传送当前用户列表
4------表示客户端离开
5------表示客户加入
6------表示发送和接收文件
*/
int current_number/* 当前在线人数*/
struct User user_list[MAX_CHATER]
/* 服务端维护的用户列表 */
}
/*客户端发出的离开信息*/
struct Message4{
int Func_number /*功能号: 此处取4 CLIENT_LEFT
1------表示转发信息
2------表示转发更名通知
3------表示传送当前用户列表
4------表示客户端离开
5------表示客户加入
6------表示发送和接收文件
*/
char client_name[50] /* 离开的客户端名称*/
}
/*新客户登录提示*/
struct Message5{
int Func_number /*功能号: 此处取5 CLIENT_COME
1------表示转发信息
2------表示转发更名通知
3------表示传送当前用户列表
4------表示客户端离开
5------表示客户加入
6------表示发送和接收文件
*/
char username[50] /*新客户名称*/
}
/*读取文件块大小*/
struct datablock{
unsigned char block[FILE_BLOCK]/*读取文件的块大小*/
}
/*发送接收文件的数据结构*/
struct Message6{
int Func_number /*功能号: 此处取6 SEND_RECV_FILE
1------表示转发信息
2------表示转发更名通知
3------表示传送当前用户列表
4------表示客户端离开
5------表示客户加入
6------表示发送和接收文件
*/
struct datablock msg /*文件数据块*/
char file_name[512] /*文件名*/
int end_flag /*文件结束标记
0------包含有文件信息
1------表示请求发送文件,要求建立连接
2------表示请求成功(对方同意接收文件)
3------表示请求不成功(对方不同意接收文件)
7------(END_OF_FILE)表示文件传送完成
*/
char send_user_name [50]/* 发送数据的用户呢称 */
char recv_user_name [50]/* 接收数据的用户名称 */
}
/*
* Netchat 1.0 Server
*/
#include "head.h"
int main(int argc,char ** argv)
{
int listen_fd /*define var for listen*/
int accept_fd[MAX_CHATER] /*define fd for accept*/
int port_number /*define port number*/
int total_connect_number /*define var save total number*/
int i,sockaddr_in_size/*define var for help run*/
struct sockaddr_in server_addr /*define server addr*/
struct sockaddr_in client_addr /*define client addr*/
struct Message3 allusers /*define var to save user list*/
struct Message0 wellcome /*define hello message*/
struct timeval wait_time /*define time*/
pid_t pid
fd_set read_fdset /*define var for select*/
int max_fd /*define var to save max fd*/
sockaddr_in_size=sizeof(struct sockaddr_in)
pid=-1
/*init user list*/
memset(&allusers,0x0,sizeof(allusers))
allusers.Func_number=REFLESH_LIST
memset(&wellcome,0x0,sizeof(wellcome))
wellcome.Func_number=SAY_HELLO
/*send hello message*/
sprintf(wellcome.msg,"%s","Hello Wellcome to NETCHAT 1.0")
/*init time*/
wait_time.tv_sec=1
wait_time.tv_usec=0
/*check main arg*/
if(argc!=2)
{
fprintf(stderr,"\n[Error]\tWrong format,usage : %s [portnumber] to start server.\n",argv[0])
exit(1)
}
if((port_number=atoi(argv[1]))<0)
{
fprintf(stderr,"\n[Error]\tWrong port number, the portnumber must bigger than zero."
"(suggest bigger than 5000)\n")
exit(1)
}
/*run server socket*/
if( (listen_fd=socket(AF_INET,SOCK_STREAM,0))==-1 )
{
fprintf(stderr,"\n[Error]\tSocket error:%s\n",strerror(errno))
exit(1)
}
/*fill server address*/
bzero(&server_addr,sizeof(struct sockaddr_in))
server_addr.sin_family=AF_INET
server_addr.sin_port=htons(port_number)
server_addr.sin_addr.s_addr=htonl(INADDR_ANY)
/*bind socket to listen_fd*/
if(bind(listen_fd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr_in))==-1)
{
fprintf(stderr,"\n[Error]\tBind error:%s\n",strerror(errno))
exit(1)
}
/*listen...*/
listen(listen_fd,MAX_CHATER)
fprintf(stderr,"\n-->The server had started successfully<--")
/*init accept_fd*/
memset(accept_fd,-1,MAX_CHATER)
max_fd=-1
total_connect_number=0
/*init userlist the total number*/
allusers.current_number=total_connect_number
/*set listen_fd nonblock*/
fcntl(listen_fd,F_SETFL,O_NONBLOCK)
while(1)
{
int i
char tmp_command[128]
fflush(stdout)
/*re-set read_fdset*/
FD_ZERO(&read_fdset)
/*add listen_fd to the read_fdset*/
FD_SET(listen_fd,&read_fdset)
if(listen_fd>max_fd)
max_fd=listen_fd
/*add keybord input to read_fdset*/
FD_SET(0,&read_fdset)
/* readd all acceptfd to fdsett*/
for(i=0i<total_connect_numberi++)
{
FD_SET(accept_fd[i],&read_fdset)
if(accept_fd[i]>max_fd)
max_fd=accept_fd[i]
}
/* wait_time.tv_sec=1
wait_time.tv_usec=0
*/
fprintf(stderr,"\n(Type \"exit\" and ENTER to exit)Enter command ->")
fflush(stdout)
/*do select*/
/* select(max_fd+1,&read_fdset,NULL,NULL,&wait_time)*/
select(max_fd+1,&read_fdset,NULL,NULL,NULL)
if(FD_ISSET(0,&read_fdset))
{
char tmp_char
int k=0
tmp_char=getchar()
while(tmp_char!='\n')
{
tmp_command[k]=tmp_char
k++
tmp_char=getchar()
}
}
if(strcmp(tmp_command,"exit")==0)
goto exit_come
if(FD_ISSET(listen_fd,&read_fdset))
{
/*accept a new connect*/
accept_fd[total_connect_number]=accept(listen_fd,
(struct sockaddr *)(&client_addr),&sockaddr_in_size)
/*add the new user to read_fdset*/
if(accept_fd[total_connect_number]!=-1)
{
int k
time_t timep /*define the second tmp*/
struct Message5 new_user
memset(&new_user,0,sizeof(new_user))
new_user.Func_number=CLIENT_COME
time(&timep)
/*become the username*/
sprintf(wellcome.username,"%s%d","chater",timep%10000)
strcpy(new_user.username,wellcome.username)
fprintf(stderr,"\n[TIP]\tA user connected")
send(accept_fd[total_connect_number],&wellcome,sizeof(wellcome),0)
for(k=0k<total_connect_numberk++)
{
/*send wellcome message*/
send(accept_fd[k],&new_user,sizeof(new_user),0)
}
/*add the new connect fd to read_fdset*/
FD_SET(accept_fd[total_connect_number],&read_fdset)
/*re-value the max_fd*/
if(accept_fd[total_connect_number]>max_fd)
{
max_fd=accept_fd[total_connect_number]
}
sprintf( allusers.user_list[total_connect_number].user_name,
"%s",wellcome.username)
sprintf( allusers.user_list[total_connect_number].user_address,
"%s",inet_ntoa(client_addr.sin_addr) )
/*compute the new total number*/
allusers.current_number++
total_connect_number++
/*re-init the client address*/
memset(&client_addr,0x0,sizeof(client_addr))
}/*add accept_fd to fd_set end*/
continue
}/*test new user come end*/
/*test is there are any message come*/
for(i=0i<total_connect_numberi++)
{
/*if the message come*/
if(FD_ISSET(accept_fd[i],&read_fdset))
{
/*define var to receive the function number*/
int get_Func_number
/*peek the function number*/
if(recv(accept_fd[i],&get_Func_number,sizeof(int),MSG_PEEK)
==-1)
{
fprintf(stderr,"\n[Error]\tReceive Function number "
"error:%s",strerror(errno))
get_Func_number=-1
continue
}
/*error happened ,exit*/
if(get_Func_number<=0)
{
fprintf(stderr,"The Function number is bad:%d\n",get_Func_number)
goto exit_come
}
/*do by functin number*/
switch(get_Func_number)
{
/*transmit message to others*/
case 1:
{
/*define transmit var*/
struct Message1 get_message
int j
fprintf(stderr,"\n[TIP]\tThe get_Funcnumber is:%d",
get_Func_number)
/*receive message*/
if(recv(accept_fd[i],&get_message,
sizeof(get_message),0)==-1)
{
fprintf(stderr,
"\n[Error]\tReceive error:%s",
strerror(errno))
break
}
/*do transmit*/
for(j=0j<total_connect_numberj++)
{
send(accept_fd[j],&get_message,sizeof(get_message),0)
}
fprintf(stderr,"\n[TIP]\tTransmit1 (transmit message) message ok.")
break
}
/*change name*/
case 2:
{
/*define var for change name*/
struct Message2 get_message
int j
memset(&get_message,0,sizeof(get_message))
fprintf(stderr,"\n[TIP]\tThe get_Funcnumber is:%d",get_Func_number)
/*receive change name message*/
if(recv(accept_fd[i],&get_message,sizeof(get_message),0)==-1)
{
fprintf(stderr,"\n[Error]\tReceive error:%s",strerror(errno))
break
}
/*test name*/
for(j=0j<total_connect_numberj++)
{
if(strcmp(allusers.user_list[j].user_name,get_message.newname)==0)
{
fprintf(stderr,"\n[Error]\tThe name had exist")
memset(get_message.newname,0,sizeof(get_message.newname))
strcpy(get_message.newname,"Error")
send(accept_fd[i],&get_message,sizeof(get_message),0)
fprintf(stderr,"\n[Error]\tChange name error")
goto exit_case_come
}
}
/*change user list*/
for(j=0j<total_connect_numberj++)
{
if(strcmp(allusers.user_list[j].user_name,get_message.oldname)==0)
{
memset(allusers.user_list[j].user_name,0,
sizeof(allusers.user_list[j].user_name))
strcpy(allusers.user_list[j].user_name,get_message.newname)
}
}
for(j=0j<total_connect_numberj++)
{
send(accept_fd[j],&get_message,sizeof(get_message),0)
}
fprintf(stderr,"\n[TIP]\tTransmit2 (change name) message ok.")
break
}
case 3:
/*transmit user list*/
{
/*define int var for receive function number*/
int get_message
fprintf(stderr,"\n[TIP]\tThe get_Funcnumber is:%d",
get_Func_number)
/*receive message*/
if(recv(accept_fd[i],&get_message,
sizeof(int),0)==-1)
{
fprintf(stderr,
"\n[Error]\tReceive error:%s",
strerror(errno))
break
}
fprintf(stderr,"\n[TIP]\tTotal user number is:%d",allusers.current_number)
/*do send user list*/
if(send(accept_fd[i],&allusers,sizeof(allusers),0) == -1)
{
fprintf(stderr,
"\n[Error]\tTransmit3 message error.")
break
}
else
{
fprintf(stderr,
"\n[TIP]\tTransmit3 (send user list) "
"message ok.")
}
break
}
/*transmit user left message*/
case 4:
{
/*define var for do*/
struct Message4 get_message
int j,k
fprintf(stderr,"\n[TIP]\tThe get_Funcnumber is:%d",get_Func_number)
/*receive message*/
if(recv(accept_fd[i],&get_message,sizeof(get_message),0)==-1)
{
fprintf(stderr,"\n[Error]\tReceive error:%s",strerror(errno))
break
}
/*delete user from accept_fd[] and userlist[]*/
for(j=0j<total_connect_numberj++)
{
if(strcmp(allusers.user_list[j].user_name,get_message.client_name)==0)
{
for(k=jk<total_connect_number-1k++)
{
allusers.user_list[k]=allusers.user_list[k+1]
}
for(k=jk<total_connect_number-1k++)
{
accept_fd[k]=accept_fd[k+1]
}
break
}
}
total_connect_number--
allusers.current_number--
/*send all user the left message*/
for(j=0j<total_connect_numberj++)
{
send(accept_fd[j],&get_message,sizeof(get_message),0)
}
fprintf(stderr,"\n[TIP]\tTransmit4 (a user had exit) message ok.")
break
}/*end of case 4*/
/*receive file*/
case 6:
{
struct Message6 get_message
int j
fprintf(stderr,"\n[TIP]\tThe get_Funcnumber is:%d",get_Func_number)
memset(&get_message,0,sizeof(get_message))
if(recv(accept_fd[i],&get_message,sizeof(get_message),0)==-1)
{
fprintf(stderr,"\n[Error]\tReceive error:%s",strerror(errno))
break
}
for(j=0j<total_connect_numberj++)
{
/*find the dest accept_fd*/
if(strcmp(allusers.user_list[j].user_name,get_message.recv_user_name)==0)
{
break
}
}
/*transmit the info*/
send(accept_fd[j],&get_message,sizeof(get_message),0)
break
}
default:
{
fprintf(stderr,"\n[TIP]\tThe get_Funcnumber is:%d\n",get_Func_number)
goto exit_come
}
exit_case_come:
}/*end of switch*/
}/*end of if*/
}/*end of for*/
}/*end of while*/
exit_come:
close(listen_fd)
exit(0)
}/*end of main*/
和编译(OR IDE)环境有关,比如vc就可以直接使用所有c的库函数.ftp使用TCP,那么就用流式套接字(SOCK_STREAM)的相关函数,如果作为客户端,调用顺序如下:
1 socket()
2 connect()
3 send/recv
4 closesocket()
如果是服务器端,调用顺序如下:
1 socket()
2 bind()
3 listen()
4 accept()
5 send/recv()
6 closesocket()
vc下有库ws2_32.lib可供使用
程序只能在传输层进行开发(既TCP/UDP),不可以在应用层进行 *** 作,即没有这样的库,调用它一个函数就实现了ftp的客户端或服务器端。如果需要可以参照网上的ftp代码。
使用如上库很简单:
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
...
详见msdn
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)