至于调试,很简单, 用 gdb 调试 server端即可,由于你是用fork子进程来处理新连接,需要在gdb里 set follow-fork-mode child。具体自己去学gdb吧。或者你改成不用fork,单进程处理,比如用 select/pthread 等手段,这样也比较好调试。
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <strings.h>
#include <unistd.h>
#define MAXLINE 4096
void echo_write(int sockfd)
ssize_t written(int sockfd, const void *buf, size_t nbytes)
ssize_t readline(int sockfd, void *buf, int maxlen)
int main(int argc, char **argv) {
int listenfd, connfd, len
pid_t pid
struct sockaddr_in servaddr, cliaddr
char bufaddr[MAXLINE]
listenfd = socket(AF_INET, SOCK_STREAM, 0)
servaddr.sin_family = AF_INET
servaddr.sin_addr.s_addr = htonl(INADDR_ANY)
servaddr.sin_port = htons(9999)
bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr))
listen(listenfd, 100)
for( ) {
len = sizeof(cliaddr)
connfd = accept(listenfd, (struct sockaddr*) &cliaddr, &len)
printf("accept ok\n")
if( (pid = fork()) == 0) {
printf("connection from %s : %d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, bufaddr, sizeof(bufaddr)),
ntohs(cliaddr.sin_port))
close(listenfd)
printf("echo_write start.\n")
echo_write(connfd)
close(connfd)
exit(0)
}
close(connfd)
}
exit(0)
}
void echo_write(int sockfd) {
char buf[MAXLINE]
ssize_t n
printf("let's read.\n")
again:
printf("begin read.\n")
while( (n = readline(sockfd, buf, MAXLINE)) >0) {
printf("n: %d\n", n)
written(sockfd, buf, n)
printf("written ok.\n")
}
if(n <0 &&errno == EINTR) {
goto again
} else if(n <0) {
printf("read error")
}
}
ssize_t readline(int sockfd, void *buf, int maxlen) {
char *ptr, c
ssize_t n, rc
ptr = buf
for(n = 1n <maxlenn++) {
again:
if( (rc = read(sockfd, &c, 1)) == 1) {
*ptr++ = c
if(c == '\n') {
break
}
} else if(rc == 0) {
*ptr = 0
return n - 1
} else {
if(rc <0 &&errno == EINTR) {
goto again
}
return -1
}
}
*ptr = 0
return n
}
ssize_t written(int sockfd, const void *buf, size_t nbytes) {
const char *buf_ptr
size_t nleft = nbytes
ssize_t nwritten
buf_ptr = buf
while(nleft >0) {
if( (nwritten = write(sockfd, buf_ptr, nleft)) <= 0) {
if(nwritten <0 &&errno == EINTR) {
nwritten = 0
} else {
return -1
}
}
nleft -= nwritten
buf_ptr += nwritten
}
return nbytes
}
一、功放面板名称功能认识:1.混响总音量:ECHO 或者 ECHO VOL 该旋钮可以控制混响回音的直达声大 小,也就是整个混响效果的多与少! 注意: 配合该功能使用的还有两个功能旋钮--REPEAT(混响的重复次数长短)、 DELAY(该旋钮可以调节混响回音延长时间的森行长短)这 3 个功能旋钮必须配合使 用,缺一不可,否则效果不理想,要想调试出比较满意的效果必须 3 个旋钮一起 调节,反复感觉。
2.话筒总音量:MIC VOL 该旋钮可以控制所有话筒的音量。 注意:话筒总音量下面还有 3 个话筒音量控制旋钮,可以分别控制各个话筒的音 量:MIC1 (话筒 1 音量) MIC2(话筒 2 音量) MIC3(话筒3音量) 。
3.音乐总音量:MUSIC VOL 该旋钮可以控制电脑伴奏的音量大小,调节该旋 钮可以实现歌曲声音的大小 。
4.音质控制:MIC BASS(话筒低音) MIC TREBLE(话筒高音) MUSIC BASS (音乐低音) MUSIC TREBLE(音乐高音) 5:左右声道平衡:BALANCE 该旋钮必须调在正中间,否则左右音箱发出来的 声音大小不一样 。
二、调音技巧:
1.关于话筒啸叫 通常话筒啸叫都是由于话筒的音量过大造成的,要仔细看看是属于话筒总音量过 大造成还是属于个别话筒音量过大造成。 另一个造成话此唯哗筒啸叫的原因就是话筒音 质过大造成的,要仔细听一下啸叫的频率:很刺耳的尖叫是属于 MIC TREBLE(话 筒山拦高音)造成的,必须把话筒高音减小点。
2.通常情况下,也就是在营业期间,如果客人要求调节一下混响的轻与重,尽 量不要去调节混响效果里面的 REPEAT 或者 DELAY,只要把 ECHO(ECHO VOL) 加大或者减少就可以。
3.电脑音乐伴奏音量的控制以不要覆盖过客人唱歌的声音为主。 否则客人唱歌 会觉得辛苦,吃力,费劲。
4.在调音技术当中也有个关键的问题,就是话筒的配对问题。 如果一个包厢里 面的话筒不是统一一个牌子的话,那么它们的频率也就不一样的,说简单点就是 话筒的音质不一样,如果它们的音质不一样的话,我们调音的时候就很难办了, 当你照顾好这个牌子的话筒的音质后,那另外个牌子的话筒音质又体现不出来 了。
echo命令(1)功能:打开或关闭命令回显(即命令运行时的显示)/显示信息
(2)语法:echo [{on|off}] [message]
(3)参数:on 打开命令回显。
off 关闭命令回显。
message 指定要显示的文本激乱拆(例:执行“@echo This a ECHO command.”,显示“This a ECHO command.”)。
(4)特殊用法:“echo”不带任何参数将显示当前回显设置。“echo.”显示一个空行。
echo好像还有些复杂的用法,明枣但作为作业应该只是实现回显吧。
你的程序只能一个字符一个字符的输入,要一次回显应该用带参数的main:陪戚
void main(int argc ,char *argv[])
{
for (int i=1i<argci++)
cout<<argv[i]<<' '
cout<<endl
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)