Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 13
  1. #1
    Tham gia
    02-08-2005
    Bài viết
    8
    Like
    0
    Thanked 0 Times in 0 Posts

    Chút rắc rối về lập trình socket trên linux

    Mình có 1 để bài như thế này :
    Viết chương trình mô phỏng Client/server trên 2 máy khác nhau.Client gửi cho server một dòng lệnh và server thực thi dòng lệnh đó.Nếu thành công thì thông báo lại cho Client.
    Mình đã viết demo 2 chương trình đó như sau:
    Code:
    //chuong trinh Client
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    
    #define MYPORT 5544;
    int main ()
    {
    	//Khai bao cac bien 
    	int sockfd;
    	int len;
    	struct sockaddr_in address;
    	int result;
    	char *command;
    	//khoi tao socket cho Client
    	sockfd = socket(AF_INET,SOCK_STREAM,0);
    	address.sin_family = AF_INET;
    	address.sin_port = MYPORT;
    	address.sin_addr.s_addr = inet_addr("127.0.0.1");
    	len = sizeof(address);
    
    	printf("Nhap vao command ban muon thuc hien tren Server:\n");
    	scanf("%s",&command);	
    
    	result = connect(sockfd,(struct sockaddr *)&address,len);
    	if(result == -1){
    		perror("oops:Client problem");
    	
    	}
    	send(sockfd,command,sizeof(command),0);
    	
    	close(sockfd);
    	
    }
    Chuong trinh Server
    Code:
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    #define MYPORT 5544
    
    main ()
     {
    	int server_sockfd,client_sockfd;
    	int server_len,client_len;
    
    	struct sockaddr_in server_address;
    	struct sockaddr_in client_address;
    	char buffer[512];
    	
       //khoi tao socket
    	server_sockfd = socket(AF_INET,SOCK_STREAM,0);
    	
       //thong bao loi neu khoi tao socket khong thanh cong
    	
    	
    	server_address.sin_family = AF_INET;
    	server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
    	server_address.sin_port = MYPORT;
    
    	server_len = sizeof(server_address);
    
    	bind(server_sockfd,(struct sockaddr *)&server_address,server_len);	
    	//lang nghe ket noi tu Client 
    	listen(server_sockfd,5);
    
      while(1) {
    	printf("server waiting\n");
    	int byte_count;
    	client_sockfd = accept(server_sockfd,(struct sockaddr
     *)&client_address,&client_len);
    	//nhan message tu Client
    	byte_count = recv(server_sockfd,buffer,sizeof buffer,0);
    	printf("Da nhan duoc %d bytes tu Client",byte_count);
    	
    	printf("Client yeu cau Server thuc hien Command sau: %s",buffer);
    	system(buffer);
    	close(client_sockfd);
      }
    }
    Client và Server thì thấy nhau đc còn lệnh command thì nó ko thể thực hiện đc.Mình vẫn chưa rõ lắm về hàm system().Các pro chỉ giáo thêm cho mình với.
    CHƯƠNG TRÌNH NÀY CHẠY TRÊN LINUX!
    Được sửa bởi KySiRo lúc 00:05 ngày 22-11-2007
    Quote Quote

  2. #2
    Tham gia
    02-08-2005
    Bài viết
    8
    Like
    0
    Thanked 0 Times in 0 Posts
    Hic,các bác nào có kinh nghiệm về lập trình socket chỉ mình với !!!!!!!!!!

  3. #3
    Tham gia
    24-07-2007
    Bài viết
    108
    Like
    0
    Thanked 0 Times in 0 Posts
    Khó nhìn quá, đổi cái <code>.. thành [code] đi

  4. #4
    Tham gia
    02-08-2005
    Bài viết
    8
    Like
    0
    Thanked 0 Times in 0 Posts
    Hì,nhầm 1 chút.Đổi rồi đó bạn

  5. #5
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post

    byte_count = recv(server_sockfd,buffer,sizeof buffer,0);
    // Bạn thêm chỗ này
    buffer[byte_count] = 0;


    Vì chuỗi buffer[512] của bạn có thể có những ký tự rác nên system ko hiểu?

  6. #6
    Tham gia
    02-08-2005
    Bài viết
    8
    Like
    0
    Thanked 0 Times in 0 Posts
    Vẫn chưa được bạn ơi.Ví dụ mình chỉ gởi command là 1,2 ký tự thì nó nhận đc.Còn nếu gửi nhiều hơn như : netstat,ping .... thì nó báo : bad file descriptor.

  7. #7
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    Ùm mình tưởng lỗi ở SERVER.
    Nhìn kỹ lại thì bị mắc lỗi cơ bản ở CLIENT mà chả liên quan tới SOCKET gì hết

    Code:
    	char *command; 
    	//khoi tao socket cho Client
    	sockfd = socket(AF_INET,SOCK_STREAM,0);
    	address.sin_family = AF_INET;
    	address.sin_port = MYPORT;
    	address.sin_addr.s_addr = inet_addr("127.0.0.1");
    	len = sizeof(address);
    
    	printf("Nhap vao command ban muon thuc hien tren  Server:\n");
    	scanf("%s",&command);	

  8. #8
    Tham gia
    24-07-2007
    Bài viết
    108
    Like
    0
    Thanked 0 Times in 0 Posts
    Vấn đề là cái send(sockfd,command,sizeof(command),0);. Vì command có kiểu là char* nên sizeof(command) = 1 chứ không phải bằng kích thước của xâu muốn gửi đi. Bạn có thể sửa lại là
    Code:
    send(..,sizeof(char) * strlen(command),..);
    Còn system(..) là gì thì bạn thử "man system" thì biết.
    Được sửa bởi nguyen.the.vinh lúc 17:34 ngày 22-11-2007

  9. #9
    Tham gia
    02-08-2005
    Bài viết
    8
    Like
    0
    Thanked 0 Times in 0 Posts
    Cảm ơn mấy bạn nhiều lắm .Mình đã làm được rồi.Merci Beaucoup!
    Được sửa bởi KySiRo lúc 17:56 ngày 26-11-2007

  10. #10
    Tham gia
    21-11-2002
    Location
    HCMC
    Bài viết
    59
    Like
    0
    Thanked 0 Times in 0 Posts
    bạn ơi cho mình xin cái source code hoàn chỉnh được kg?
    cho mình xin luôn lệnh nào để in ra được log của client.
    Lệnh client sử dụng trên máy chủ (cái này bạn làm rùi)
    IP của client.
    thời gian log vô của client.
    Merci

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •