PDA

View Full Version : [Q] Lập trình socket của Linux



vison
12-05-2003, 18:05
Tôi đang lập chương trình giao tiếp file giữa 2 tiến trình theo mo hình server/client:cụ thể là trình khách gửi yêu cầu cần file nào đó,trình chủ tiếp nhận và gửi file cho trình khách.Lập trình xong ,biên dịch ko có lỗi nhưng ko đạt kết quả như ý muốn.Mong các bạn chỉ giáo cho mình,sau đây là nội dung 2 file

vison
12-05-2003, 18:06
server.c

#include <stdio.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/stat.h>
int main()
{
int server_sockfd,client_sockfd,n;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

// Loai bo cac ten hay lien ket socket khac truoc do neu co
// Dong thoi khoi tao socket moi cho trinh chu

server_sockfd=socket(AF_INET,SOCK_STREAM,0);

// Dat ten cho socket cua trinh chu
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=inet_addr("127.0.0.1");
server_address.sin_port=htons(9782);
server_len=sizeof(server_address);

// Rang buoc ten voi socket vua tao ra
bind(server_sockfd,(struct sockaddr*)&server_address,server_len);

//Mo hang doi cho ket noi,cho fep dat hang doi toi da 5 ket noi
listen(server_sockfd,5);

//Lap lien tuc cho de ket noi trinh khach
while(1)
{
char GetFileName[50];
int f_read;
size_t rf;
char buf[1000];
printf("server dang cho ket noi\n");

//Cho va cap nhan ket noi
client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_address,&client_len);

//Doc du lieu do trinh khach gui den
n=read(client_sockfd,&GetFileName,50);
// printf("Nhan yeu cau tu trinh khach :%d %s\n",n,GetFileName);

//Thuc hien yeu cau tu trinh khach
f_read=open(GetFileName,O_RDONLY);
if(f_read<0){
printf("Khong co file nao ten la %s",GetFileName);
exit(1);
}
while((rf=read(f_read,&buf,sizeof(buf)))>0)
write(client_sockfd,&buf,rf);
// write(client_sockfd,&ch,strlen(ch));
//Dong ket noi
close(f_read);
close(client_sockfd);
}
}

vison
12-05-2003, 18:07
client.c


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char*argv[])
{
int sockfd;
int len;
struct sockaddr_in address;
int result;
char buf[1000];
char *filename;
int f_write;
size_t wf,rf;

//Doc doi so dong lenh
if(argc!=2||!argv[1]){
fprintf(stderr,"Hay nhap theo mau:%s <ten file>\n",argv[0]);
exit(1);
}

//Luu duong dan tu doi so thu nhat
filename=argv[1];

// tao socket cho trinh khach .Luu lai so mo ta socket
sockfd=socket(AF_INET,SOCK_STREAM,0);
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr("127.0.0.1");
address.sin_port=htons(9782);
len=sizeof(address);

//Thuc hien ket noi
result=connect(sockfd,(struct sockaddr*)&address,len);
if(result==-1)
{
perror("Loi client");
exit(1);
}

//Sau khi socket ket noi chung ta co the doc ghi du lieu cua socket tuong tu doc ghi tren file
write(sockfd,&(*filename),sizeof(filename));
f_write=open(filename,O_WRONLY|O_CREAT|O_TRUNC);
while((rf=read(sockfd,&buf,sizeof(buf)))>0)
write(f_write,&buf,rf);
close(f_write);
close(sockfd);
exit(0);
}

panatcb
18-05-2003, 21:09
Bạn thử lại như sau coi chạy không ?
server.c
//Tạo permanent socket for listening service //request, khi client kết nối vô server, thì một //socket tạm thời sẽ được tạo

struct sockaddr_in sin;
struct sockaddr_in pin;
int sock_descriptor;
int temp_sock_descriptor;
int address_size;

//Định nghĩa phần socket descriptor
sock_descriptor = socket (AF_INET, SOCK_STREAM, 0);
//fill in required fields
bzero(&sin, sizeof (sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(8000); // dùng port 8000
//kết nối vô port 8000
bind(sock_descriptor, (struct sockaddr *)&sin,sizeof(sin));
//start listening on the new socket
listen(sock_descriptor,20);// up to 20 //connections
/* server.c sẽ đi một vòng lập vô hạn trong khi chờ kết nốt từ cliént */
while(1){
//socket tạm thời cho client kết nối
temp_sock_descriptor = accept(sock_descriptor ,(struct sockaddr *)&pin,&address_size);
//nhận dử liệu từ client
recv(temp_sock_descriptor, buf, 16384, 0);
// proces yêu cầu client ở đây......
//return dử liệu cho client
send(temp_sock_descriptor , buf, len, 0);
//đóng socket tạm thời
close(temp_sock_descriptor);
}

hnb1988
09-11-2009, 22:19
Ai quan tâm thì vào đây tham khảo Template của nó này. Cả TCP và UDP luôn.
Vào đây nha --> http://etalks.vn/forum/upload/showthread.php?t=298

[=========> Bổ sung bài viết <=========]


Tôi đang lập chương trình giao tiếp file giữa 2 tiến trình theo mo hình server/client:cụ thể là trình khách gửi yêu cầu cần file nào đó,trình chủ tiếp nhận và gửi file cho trình khách.Lập trình xong ,biên dịch ko có lỗi nhưng ko đạt kết quả như ý muốn.Mong các bạn chỉ giáo cho mình,sau đây là nội dung 2 file


Vào đây tham khảo Template đi bạn nha -->http://etalks.vn/forum/upload/showthread.php?t=298
Cả TCP & UDP luôn