고수님들....이거 좀 봐주세요...소켓프로그램인데요....ㅠ.ㅠ

k9252의 이미지

============= client.c=======================

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_LEN 255

int main(int argc, char **argv)
{
	int s, len_out;
	struct sockaddr_in server_addr;
	char *haddr;
	char buf[BUF_LEN];
	FILE *fp;
	char line;
	
	if (argc != 2) {
		printf("usage : %s ip_address\n", argv[0]);
		exit(0);
	}

	haddr = argv[1];

	if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		printf("Can't create socket\n");
		exit(0);
	}

	bzero((char *)&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_addr(haddr);
	server_addr.sin_port = htons(2049);

	if (connect(s, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
		printf("Can't connect.\n");
		exit(0);
	}

	if ((fp = fopen("test.txt","r")) ==  NULL) {
		printf("File open error : ");
		exit(0);
	}

	printf("File open success\n");
	
	if (fgets(buf, BUF_LEN, fp)) {
		buf[BUF_LEN] = '\0';
		len_out = strlen(buf);
	} else {
		printf("fgets error\n");
		exit(0);
	}

	if (write(s, buf, len_out) < 0) {
		printf("write error\n");
		exit(0);
	}
	
	fclose(fp);

	close(s);
}

================server.c=======================

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_LEN 128

int main(int argc, char *argv[]) {
	struct sockaddr_in server_addr, client_addr;
	int server_fd, client_fd;
	int len;
	char buf[BUF_LEN + 1];
	
	FILE *fp;

	fp = fopen("receive.txt", "w");

	if (fp == NULL) {
		perror("File write error : ");
		exit(0);
	}

	if (argc != 2) {
		printf("usage : %s port\n", argv[0]);
		exit(0);
	}

	if ((server_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		printf("Server : Can't open stream socket.");
		exit(0);
	}

	bzero((char *)&server_addr, sizeof(server_addr));

	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(atoi(argv[1]));

	if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
		printf("Server : Can't bind local address.\n");
		exit(0);
	}

	listen(server_fd, 5);

	while(1) {
		printf("Server : waiting connection request.\n");
		len = sizeof(client_addr);

		client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &len);
		if (client_fd < 0) {
			printf("Server : accept failed.\n");
			exit(0);
		}

		printf("Server : A client connected.\n");
		fp = read(client_fd, buf, sizeof(buf));
		write(client_fd, buf, fp);
		close(client_fd);
	}

	close(server_fd);
}

제가 할려고 하는 것은요....

client에서 파일을 읽어서 버퍼에 저장해서

server에 파일을 생성해서 client의 버퍼에 저장되어 있는 내용을 그대로 옮기는 것입니다.

근데 제가 이상하게 짠것인지 잘 안되네요...

에러는 없는데...실행이 안되어서요...소켓프로그램인뎅...

모가 잘 못 되었는지 좀 봐주세요..고수님들.....

아직 C를 시작한지 얼마되지 않아서 잘 몰라요..

simsiant의 이미지

server.c에서여
시스템 콜 read의 return value는 버퍼에서 읽은 만큼의 크기 입니다.

시스템콜 open, read, write의 다시 한번 공부하심이...

sykes의 이미지

서버에서 파일을 열때 FILE 포인터를 이용할려고 했으면...

파일에 쓸때는 fwrite 를 이용해야죠...

그리고 read 함수는 읽은 바이트수를 리턴하는데...

그걸 fp 에다가 저장하면 fp가 엉뚱한대를 가리키게 됩니다...

망설이지 말고 해보는거야~

zedai1972의 이미지

cli.c
:1. buf[BUF_LEN] = '\0'; 는 의미없음 . fgets는 읽은 버퍼 마지막에 null을 삽입하므로.

srv.c

1. read의 리턴값(읽은 바이트 수)는 write의 세번째 아큐먼트여야함.
2. 마지막 write 함수의 아큐먼트는 아래처럼 바껴야함.
client_fd -> fileno(fp)
fp -> read의

[/code][/b]

\\(^^ )^^)// **

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.